为什么我的代码输出0000000000000作为无效的ISBN号?

时间:2018-10-15 13:08:51

标签: python python-3.x

0000000000000是一个有效的ISBN号,但是我的代码说它无效。 我的代码使用13位数字,并检查其是否有效。

ISBN的前12位数字分别与1和3相乘。然后,我们将它们相加并将其总和除以10,得到提示。如果10减去提醒等于第13位数字,则表示有效。

isbnNunmberCheck=input()

n1=int(isbnNunmberCheck[0])*1
n2=int(isbnNunmberCheck[1])*3
n3=int(isbnNunmberCheck[2])*1
n4=int(isbnNunmberCheck[3])*3
n5=int(isbnNunmberCheck[4])*1
n6=int(isbnNunmberCheck[5])*3
n7=int(isbnNunmberCheck[6])*1
n8=int(isbnNunmberCheck[7])*3
n9=int(isbnNunmberCheck[8])*1
n10=int(isbnNunmberCheck[9])*3
n11=int(isbnNunmberCheck[10])*1
n12=int(isbnNunmberCheck[11])*3

k=10-(n1+n2+n3+n4+n5+n6+n7+n8+n9+n10+n11+n12)%10

if k==int(isbnNunmberCheck[-1]):
    print("Valid")
else:
    print("Invalid")

3 个答案:

答案 0 :(得分:1)

好吧,您的总和为0,所以余数将为0,然后(10-余数)= 10,所以10!=0。

我认为看at this link时,您的开篇是不正确的。

答案 1 :(得分:0)

  

如果10减去余数等于第13位,那么它是有效的。

对于您的ISBN,“ 10减去余数”为10 - 0 % 10 = 10。这不等于第13位数字,0。自10 != 0起,该ISBN无效。

但是您的代码很冗长。让我们考虑一种更好的算法编写方法:

isbn_str = input()

k = 10 - (sum(map(int, isbn_str[0:-1:2])) + sum(map(int, isbn_str[1:-1:2]))*3) % 10

print(k)

if k == int(isbn_str[-1]):
    print("Valid")
else:
    print("Invalid")

请注意,您可以使用与切片列表相同的方式对字符串进行切片,即使用语法start:stop:stepmap + int将可迭代的每个元素延迟地转换为整数,而sum则将这些整数求和。另请参见Understanding Python's slice notation

答案 2 :(得分:0)

关键声明是:

If this calculation results in an apparent check digit of 10, the check digit is 0

从您的评论而不是原始问题开始。

因此,如果校验位为10,则您实际上需要在比较中使用0。

然后计算您的支票号码:

k = 0 if k == 10 else k