【问题标题】:Python3 check digit algorithmPython3校验位算法
【发布时间】:2018-08-25 10:09:43
【问题描述】:

我正在学习全神贯注于编程,并被分配了以下任务:

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

z1z2z3z4z5z6z7z8z9z10

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

s = 1 * z1 + 2 * z2 + 3 * z3 + 4 * z4 sub> + 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 所学到的任何东西,但是这项任务似乎有点困难(这是我正在研究的这本书的早期章节),我被卡住了,没有得到这不是我的想法。

提前感谢您,祝您有美好的一天!

【问题讨论】:

  • “怎么叫”,没错,就是叫除法。
  • 我的问题是为什么它会这样工作,我监督的工作是什么,我很清楚它使用了部门,我什至在本文中多次使用了“部门”这个词,但这根本没有帮助。
  • 当你看到代码反复重复几行时,你应该尝试用for循环替换它。
  • 看,假设我们有 number = 123(一个十进制的数字 - 以 10 为底),每次你做 number%10 时,你都会得到这个数字的最左边的数字。所以对于 123,123%10 给你 3。另外,number//10 会切断最左边的数字。所以 123//10 等于 12。然后您重复相同的步骤多次以获得所有数字。
  • 10 在这里很特别,因为该数字以 10 为底(十进制)。假设如果你有一个二进制数,你会对 2 做同样的事情。为了进一步理解它,想象一下 123 = 1*100 + 2*10 + 3,所以你看到 123 除以 10 的余数是 3,即只不过是 123 的最右边的数字。当你将它除以 10 时,它变成 12 = 1*10+2(即所有数字向右移动 1)。

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


【解决方案1】:

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

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

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

这个重复的代码需要循环。想象一下,您必须处理 100 位数字。

【讨论】:

    【解决方案2】:

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

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

    输入一些输入验证,你会得到:

    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
    

    【讨论】:

      【解决方案3】:

      它从模数开始。而模,ICBN的长度和系数刚好吻合,因为系数没有问题(通过模数性质(如果x mod y = 0,则k * x mod y = 0,其中k是整数))。

      【讨论】:

      • αριθμός 中没有“φ”(“ph”),因为ῥυθμός(“rhythm”)中没有“φ”。两者都写有“θ”,后来音译为“th”。这种发音上的微小变化既不罕见,也不罕见is it exactly new,虽然......
      • 哦,对不起,“节奏”同源词弊大于利。只是关于 'ph' -> 'th' 转变(“arithmetic”),'y' 似乎来自 'υ'...
      猜你喜欢
      • 2017-02-23
      • 2021-07-30
      • 2016-01-31
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多