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")
答案 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:step
。 map
+ 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