Python3校验位算法

2024-09-27 07:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何围绕编程进行思考,并被赋予以下任务:

The ISBN (International Standard Book Number) is made out of 10 digits.

z1z2z3z4z5z6z7z8z9z10

最后一个数字z10是校验位。它是这样做的:首先,用这个公式创建一种交叉和:

s = 1 * z1 + 2 * z2 + 3 * z3 + 4 * z4 + 5 * z5 + 6 * z6 + 7 * z7 + 8 * z8 + 9 * z9

校验位z10是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)

我的问题很简单:它是如何工作的?为什么我要一直计算“number//10”和“number%10”,而且总是这样?这种算法有名字吗?如果有,怎么叫?在

如果你觉得这是最简单的事情,你觉得我在浪费你的时间,我很抱歉。到目前为止,我对python的学习了解得差不多,但是这个任务似乎有点难(这是我正在学习的书的一个很早的章节中),我被卡住了,没能忘记这一点。在

提前谢谢你,祝你今天愉快!在


Tags: number编程校验位isbnz3z2z1z10
3条回答

它是从模arytmetic开始的。而模,ICBN的长度和系数正好一致,因为系数无所谓(根据模的算术性质(如果x mod y=0,比k*x mod y=0,其中k是整数))。在

运算x % 10称为“模数”,并返回除以10的余数。在代码中使用它来隔离最右边的数字。在

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

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

这些重复的代码需要循环。想象一下你必须处理100位数字。在

您正在使用%即模数和整数除法//一次得到一个数字。在

而不是将整数转换为整数,然后提取单个数字,而是对输入的字符串进行处理。在

输入验证可以得到:

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,您可以得到:

^{pr2}$

相关问题 更多 >

    热门问题