我正在尝试实施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()是一个用整数之和代替整数的函数
答案 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()
返回True
,luhn_check()
返回{ {1}})-因此您可以尝试使用它。