嘿,我正在为Luhn的学校作业做算法。
一些输出以正确的方式出现;但有些人不是。
0004222222222222
总共给了我44
,
和
0378282246310005
总共给了我48
,
举几个例子。
我知道我的代码并不是最干净的,因为我是新手但是如果有人能够确定我在哪里得到错误我真的很感激
这是我的代码:
cardNumber = input( "What is your card number? ")
digit = len(cardNumber)
value = 0
total = 0
while ( len( cardNumber ) == 16 and digit > 0):
# HANDLE even digit positions
if ( digit % 2 == 0 ):
value = ( int( cardNumber[digit - 1]) * 2 )
if( value > 9 ):
double = str( value )
value = int( double[:1] ) + int( double[-1] )
total = total + value
value = 0
digit = digit - 1
else:
total = total + value
value = 0
digit = digit - 1
# HANDLE odd digit positions
elif ( digit % 2 != 0):
total = total + int( cardNumber[digit - 1] )
digit = digit - 1
答案 0 :(得分:2)
你几乎做对了。只有最后一个数字(或后面的第一个数字)才应被视为16位数卡的奇数。所以你应该设置:
digit = len(cardNumber) - 1
然后你的而条件应该停在>= 0
(第0项包括在内);请注意,len( cardNumber ) == 16
是多余的,因为卡的长度是恒定的:
while digit >= 0:
最后,您对信用卡号码的索引将不再需要减1:
value = int(cardNumber[digit]) * 2
...
...
total = total + int(cardNumber[digit])
答案 1 :(得分:0)
因此,您的代码大多是正确的,唯一的问题是您没有正确定义应该被视为“奇数”和“偶数”的数字。当您从末尾读取数字时,“奇数和偶数”也是相对的,所以:
示例:1234是EOEO,12345是OEOEO(O表示奇数,E表示偶数)
这里是固定代码(我只修改了三行,见注释):
digit = len(cardNumber)
value = 0
total = 0
while digit > 0: # I removed the length condition
# HANDLE even digit positions
if ( (len(cardNumber)+1-digit) % 2 == 0 ): # <- modification here
value = ( int( cardNumber[digit - 1]) * 2 )
if( value > 9 ):
double = str( value )
value = int( double[:1] ) + int( double[-1] )
total = total + value
digit = digit - 1
else:
total = total + value
digit = digit - 1
# HANDLE odd digit positions
elif ( (len(cardNumber)+1-digit) % 2 != 0): # <- modification here
value=int( cardNumber[digit - 1] )
total = total + int( cardNumber[digit - 1] )
digit = digit - 1
return total
一些测试:
In : '0378282246310005' -> Out : 60
In : '00378282246310005' -> Out : 60
In : '0004222222222222' -> Out : 40