这是我的代码:
def isISBN(n):
if len(n)!= 10:
return False
else:
d1=int(n[0])*1
d2=int(n[1])*2
d3=int(n[2])*3
d4=int(n[3])*4
d5=int(n[4])*5
d6=int(n[5])*6
d7=int(n[6])*7
d8=int(n[7])*8
d9=int(n[8])*9
d10=(d1+d2+d3+d4+d5+d6+d7+d8+d9)
num=d10%11
print(d10,num)
if num==10:
return True
else:
return False
以下是我老师给我们的一些测试用例:
>>> isISBN('020103803X')
True
>>> isISBN('0540122068')
True
>>> isISBN('020108303X')
False
>>> isISBN('0540122069')
False
代码未通过测试'0540122068'
,因为我的输出为False
,但我不知道原因。
答案 0 :(得分:2)
不要忘记第10个值并检查模数等价为0:
def isISBN(n):
if len(n)!= 10:
return False
else:
d1=int(n[0])*1
d2=int(n[1])*2
d3=int(n[2])*3
d4=int(n[3])*4
d5=int(n[4])*5
d6=int(n[5])*6
d7=int(n[6])*7
d8=int(n[7])*8
d9=int(n[8])*9
if n[9] == 'X':
d10 = 10
else:
d10 = int(n[9])
d10 = d10*10
d11=(d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)
num=d11%11
if num==0:
return True
else:
return False
isISBN("3680087837")
答案 1 :(得分:1)
根据此algorithm,有一种数学方法可以计算ISBN
的正确性。
此外here是该算法的另一个简要描述:
十位数国际标准书号的最终字符 是一个计算的校验位,以便将每个数字乘以它 数字中的位置(从右边算起)并取总和 模数11的这些产品是0.最右边的数字 (乘以1)是校验位,用于计算总和 正确。它可能需要具有值10,其表示为 字母X.例如,取ISBN 0-201-53082-1:总和 产品为0×10 + 2×9 + 0×8 + 1×7 + 5×6 + 3×5 + 0×4 + 8×3 + 2×2 + 1×1 =99≡0(mod 11)。所以ISBN是有效的。请注意,位置也可以从左侧开始计算,在这种情况下,校验位将乘以 10,检查有效期:0×1 + 2×2 + 0×3 + 1×4 + 5×5 + 3×6 + 0×7 + 8×8 + 2×9 + 1×10 =143≡0(mod 11)。
算法如下:
1
开始按增量编号多个每个。这是第一个数字乘以1
,第二个数字乘以2
,最多数字10
乘以10
。11
(即sum % 11
)0
,则给定的ISBN
有效,如果有的话,则不然。从上面的参考资料中可以看出,您的错误如下:
ISBN
而不是0
,则10
有效。注意:
作为上述参考状态,您可以将最后一位数字设为X
,因为10
中的ISBN
不能作为数字X
。在这种情况下,您想要检查第10位数是10
是否使用d10 = 10*10 if n[9] == "X" else n[9]*10
数字而不是:
xlsx