Python:Luhn算法/ if语句永远不会执行

时间:2018-07-29 09:51:17

标签: python python-3.x algorithm if-statement luhn

我正在尝试实施Luhn算法来检查信用卡号的有效性。为此,需要将第二个数字乘以2,如果结果> 9,则将其替换为数字总和。

def luhn_check(creditcardnr):
"""
check if credit card number is valid using the Luhn's algorithm
"""

som = 0
for i, digit in enumerate([int(x) for x in str(creditcardnr)]):
    if i in range(1, len(str(creditcardnr))-1,2):
        digit *= 2
        if digit > 9:
            digit -= digitsum(digit)
    som += digit
    print('digit :',digit,'    sum :',som)

return som % 10 == 0

运行此代码时,我得到的结果是

digit : 5    sum : 5
digit : 2    sum : 7
digit : 2    sum : 9
digit : 9    sum : 18
digit : 7    sum : 25
digit : 2    sum : 27
digit : 0    sum : 27
digit : 9    sum : 36
digit : 3    sum : 39
digit : 9    sum : 48
digit : 6    sum : 54
False

第二个和应该是9而不是7

digitsum()是一个用整数之和代替整数的函数

1 个答案:

答案 0 :(得分:0)

您的代码不适用于52297209396-假设:

def digitsum(n):
    s = 0
    while n:
        s += n % 10
        n //= 10
    return s

但是Wikipedia version-per Simon's comment也没有:

def check_luhn(purported_cc):
    sum_ = 0
    parity = len(purported_cc) % 2
    for i, digit in enumerate([int(x) for x in purported_cc]):
        if i % 2 == parity:
            digit *= 2
            if digit > 9:
                digit -= 9
        sum_ += digit
    return sum_ % 10 == 0

print(luhn_check(52297209396))  # False

但是,使用上面定义的digitsum(n),我无法重现您的错误:

  

第二个和应该是9而不是7

('digit :', 5, '    sum :', 5)
('digit :', 4, '    sum :', 9)
('digit :', 2, '    sum :', 11)
('digit :', 9, '    sum :', 20)
('digit :', 7, '    sum :', 27)
('digit :', 4, '    sum :', 31)

所以我假设52297209396无效。

数字79927398713(通过Wikipedia提供的工作号码示例)确实与算法的Wikipedia语句相反(check_luhn()返回Trueluhn_check()返回{ {1}})-因此您可以尝试使用它。