HP CodeWars - UPC校验位算法

-3 投票
2 回答
757 浏览
提问于 2025-04-19 09:50

我正在为2014年的HP CodeWars做准备,尝试解决往年的题目,但在 这个问题上卡住了,希望有人能帮我。

这是UPC校验位算法:

  • 首先,把所有奇数位置的数字加起来,然后把结果乘以三。
  • 接着,把所有偶数位置的数字也加到这个结果上。
  • 然后,计算这个总和对10的余数。余数就是把总和除以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

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,我们可能想要在用户点击按钮时,程序才开始运行某段代码。这个过程就叫做“事件处理”。

事件处理的基本思路是:当某个事件发生时,比如用户点击了按钮,程序就会“监听”到这个事件,然后执行预先设定好的代码。这样,程序就能根据用户的操作做出反应。

为了实现这个功能,我们通常会使用一些特定的函数或方法来设置事件监听器。这个监听器就像一个守卫,时刻关注着用户的动作,一旦发现有点击事件发生,就会立刻执行相应的代码。

总的来说,事件处理让我们的程序变得更加互动和智能,能够根据用户的行为做出相应的反应。

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
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”。

撰写回答