Python3校验数字算法

时间:2018-08-25 10:09:43

标签: python python-3.x algorithm check-digit

我正在学习将注意力集中在编程上,并已完成以下任务:

  

ISBN(国际标准书号)由10位数字组成。

     
    

z 1 z 2 z 3 z 4 z 5 z < sub> 6 z 7 z 8 z 9 z 10

  
     

最后一位数字z 10 是一个校验位。这样做是这样的:首先,您使用以下公式创建一种交叉求和:

     
    

s = 1 * z 1 + 2 * z 2 + 3 * z 3 + 4 * z 4 + 5 * z 5 + 6 * z 6 + 7 * z 7 + 8 * z 8 + 9 * z 9

  
     

校验位z 10 是s除以11的整数除的余数。对于余数10,请写x或X。示例:对于ISBN 3826604237会显示校验码7。

     

计算:1 * 3 + 2 * 8 + 3 * 2 + 4 * 6 + 5 * 6 + 6 * 0 + 7 * 4 + 8 * 2 + 9 * 3 = 150

     

150和11的除法是7。

给出的代码解决方案如下:

# isbn.py
number = int(input("Please enter a 9-digit number: "))
z9 = number % 10
number = number//10
z8 = number % 10
number = number//10
z7 = number % 10
number = number//10
z6 = number % 10
number = number//10
z5 = number % 10
number = number//10
z4 = number % 10
number = number//10
z3 = number % 10
number = number//10
z2 = number % 10
number = number//10
z1 = number
sum = z1+2*z2+3*z3+4*z4+5*z5+6*z6+7*z7+8*z8+9*z9
checkdigit = sum%11
print("\nCheckdigit:", checkdigit)

我的问题很简单:它如何工作?为什么我必须一直计算“数字// 10”和“数字%10”?这种算法是否有名称,如果有,怎么称呼它?

对此我将不胜感激,如果这对您来说似乎是最简单的事情,而您却觉得我在浪费时间,对不起。到目前为止,我几乎了解了到目前为止学习python所学到的所有知识,但是这项任务似乎有点困难(这是在我正在学习的书的很早的一章中),我陷入了困境,却没有得到这是我的脑袋。

提前谢谢您,祝您愉快!

3 个答案:

答案 0 :(得分:1)

操作x % 10被称为“模”,并返回除以10的余数。您可以在代码中使用它来分隔最右边的数字。

下一个操作x // 10被称为“整数除法”,即仅返回整数(除掉小数部分(如果有的话))的除法。十进制数字的整数除以10对应于右移一位,以便将下一位移到最右边。

重复这两个步骤,直到最后一位数字被隔离。然后执行乘法运算,最后取模数11(除以11的余数)以获得校验位。

此重复代码哭了一个循环。试想一下,您必须处理100位数字。

答案 1 :(得分:0)

您正在使用% aka模和整数除法//一次获得一位数字。

将整数转换为整数然后提取各个数字会更容易,但是要明智地处理输入的字符串字符。

进行一些输入验证,您会得到:

while True:
    # don't convert to int
    # repeat until exactly 9 digits are given
    number = input("Please enter a 9-digit number: ").strip()  
    if number.isdigit() and len(number) == 9:
        break

# generator method - enumerate gives you the position and the value of each character 
# i.e. for enumerate('123') you get (0,'1') then (1,'2') then (2,'3')
# the sum function adds up each given tuple but premultiplies the value with its (pos+1) as position inside strings start at 0 for the 1st character - it also
# converts each single character to its integer value
s1 = sum( (pos+1)*int(num) for pos,num in enumerate(number)) 

# s1 is a summed generator expression for this: 
s2 = 0  # do not use sum - its a built-in functions name
for pos,num in enumerate(number):        
    s2 += (pos+1)*int(num)

print(s1,s2)  # both are the same ;o)

checkdigit = s1%11
print("\nCheckdigit:", checkdigit)

对于382660423,您将获得:

150 150

Checkdigit: 7

答案 2 :(得分:0)

它是从模数算法开始的。并且模块,ICBN的长度和系数只是一致,导致系数无关紧要(通过模算术特性(如果x mod y = 0,则比k * x mod y = 0,其中k为整数))。