Python3校验位算法
Python3 check digit algorithm
我正在学习全神贯注于编程,并被赋予了以下任务:
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 所学的所有内容,但这项任务似乎有点困难(这是我正在学习工作的书的很早的一章)并且我被卡住了没把这件事从我脑子里抹去。
提前谢谢你,祝你有愉快的一天!
运算 x % 10
被称为 'modulus' 和 returns 除以 10 的余数。您在代码中使用它来隔离最右边的数字。
下一个操作x // 10
称为'integer division',即除法returns只整数(小数部分(如果有的话)被截掉)。十进制数除以 10 对应于右移一位,以便将下一位移到最右边的位置。
您重复这 2 个步骤,直到最后一个数字被隔离。然后你进行乘法运算,最后对11取模(除以11的余数)得到校验位
这个重复的代码哭了一个循环。想象一下您必须处理 100 位数字。
您正在使用 %
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
它从 modulo arytmetic 开始。而module,ICBN的长度和系数刚好一致,因为系数无所谓(按modulo算术性质(如果xmody=0,则k*xmod y = 0,其中 k 是整数))。
我正在学习全神贯注于编程,并被赋予了以下任务:
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 所学的所有内容,但这项任务似乎有点困难(这是我正在学习工作的书的很早的一章)并且我被卡住了没把这件事从我脑子里抹去。
提前谢谢你,祝你有愉快的一天!
运算 x % 10
被称为 'modulus' 和 returns 除以 10 的余数。您在代码中使用它来隔离最右边的数字。
下一个操作x // 10
称为'integer division',即除法returns只整数(小数部分(如果有的话)被截掉)。十进制数除以 10 对应于右移一位,以便将下一位移到最右边的位置。
您重复这 2 个步骤,直到最后一个数字被隔离。然后你进行乘法运算,最后对11取模(除以11的余数)得到校验位
这个重复的代码哭了一个循环。想象一下您必须处理 100 位数字。
您正在使用 %
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
它从 modulo arytmetic 开始。而module,ICBN的长度和系数刚好一致,因为系数无所谓(按modulo算术性质(如果xmody=0,则k*xmod y = 0,其中 k 是整数))。