检查ISBN号

时间:2016-02-05 21:19:09

标签: python

这是我的代码:

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,但我不知道原因。

2 个答案:

答案 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. 从左侧开始,从您的ISBN的每个数字开始,您将从1开始按增量编号多个每个。这是第一个数字乘以1,第二个数字乘以2,最多数字10乘以10
  2. 然后你总结那些乘法。
  3. 您使用数字11(即sum % 11
  4. 对上述总和执行模运算
  5. 如果模运算返回0,则给定的ISBN有效,如果有的话,则不然。
  6. 从上面的参考资料中可以看出,您的错误如下:

    1. 您不会将第10位乘以10。
    2. 如果模数操作在您编写时返回ISBN而不是0,则10有效。
    3. 注意:

      作为上述参考状态,您可以将最后一位数字设为X,因为10中的ISBN不能作为数字X。在这种情况下,您想要检查第10位数是10是否使用d10 = 10*10 if n[9] == "X" else n[9]*10 数字而不是:

      xlsx