HP CodeWars - UPC校验位算法

时间:2014-09-02 14:36:51

标签: python

我正在通过解决前几年的问题来准备2014年的HP CodeWars'问题,但卡在this problem,希望有人能帮助我。

  

这是UPC校验位算法:

     
      
  • 首先,将奇数位的所有数字加在一起,然后将结果乘以3。
  •   
  • 然后,将偶数位置的数字添加到结果中。
  •   
  • 接下来,找到总和的模数10。 Modulo在将总和除以10后计算余数。
  •   
  • 最后,如果余数不为零,则将其从10减去。
  •   
     

输入

     

第一行输入包含后面的UPC数量。该   每个UPC的数字将以一个空格分隔。

6

0 1 2 3 4 5 6 7 8 9 0

0 3 6 0 0 0 2 9 1 4 5 

0 7 3 8 5 2 0 0 9 3 8 

0 7 0 7 3 4 0 5 3 1 6

0 4 1 2 2 0 1 8 9 0 4 

0 3 7 0 0 0 2 0 2 1 4 
     

输出

     

对于每个UPC,程序必须打印包括计算的UPC   检查数字。每个UPC的数字应该用一个空格分隔。

0 1 2 3 4 5 6 7 8 9 0 5

0 3 6 0 0 0 2 9 1 4 5 2

0 7 3 8 5 2 0 0 9 3 8 5

0 7 0 7 3 4 0 5 3 1 6 0

0 4 1 2 2 0 1 8 9 0 4 5

0 3 7 0 0 0 2 0 2 1 4 1

这是我的程序,但似乎在某处失败了。请帮我找到错误。

n=input()
for i in range(1,n+1):
    seq=raw_input()
    ar=seq.split(" ")
    l=len(ar)
    res=0
    sume=0
    sumo=0
    for k in range(0,l):
        if k%2==0:
            sume+=int(ar[k])
        else:
            sumo+=int(ar[k])
    res=(sumo*3+sume)%10
    if res!=0:
        res=10-res
    print seq,res

错误

输出不符合预期。我得错了输出,我猜一些逻辑错误!

2 个答案:

答案 0 :(得分:1)

你对偶数和奇数的检查是错误的方式。如果你改变了

if k%2==0:
    sume+=int(ar[k])
else:
    sumo+=int(ar[k])

if k%2==0:
    sumo+=int(ar[k])
else:
    sume+=int(ar[k])

您的代码会生成正确的值。我相信说明假定第一个数字编号为“1”而不是“0”。

答案 1 :(得分:0)

n=input()
for i in range(1,n+1):
seq=raw_input()
ar=seq.split(" ")
l=len(ar)
res=0
sume=0
sumo=0
for k in range(0,l):
    if k%2==0:
        sume+=int(ar[k])
    else:
        sumo+=int(ar[k])
res=(sumo*3+sume)%10
if res!=0:
    res=10-res
print seq,res