卢恩斯算法
Luhns Algorithm
嘿,我正在为学校作业做 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
你几乎做对了。只有最后一位数字(或从后面开始的第一个数字)对于您的 16 位数字卡应该被视为奇数。所以你应该设置:
digit = len(cardNumber) - 1
然后你的 while 条件应该停止在 >= 0
(包括第零项);请注意,len( cardNumber ) == 16
是多余的,因为卡片的长度是恒定的:
while digit >= 0:
最后,您的信用卡号索引将不再需要负 1:
value = int(cardNumber[digit]) * 2
...
...
total = total + int(cardNumber[digit])
所以你的代码大部分是正确的,唯一的问题是你没有正确定义什么应该被认为是 "odd" 和 "even" 数字。当您从末尾读取数字时,"odd and even" 也是相对于末尾的,因此:
- 奇数从最后一个开始,然后每隔一个
- 偶数从最后一个开始,然后每隔一个
示例: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
嘿,我正在为学校作业做 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
你几乎做对了。只有最后一位数字(或从后面开始的第一个数字)对于您的 16 位数字卡应该被视为奇数。所以你应该设置:
digit = len(cardNumber) - 1
然后你的 while 条件应该停止在 >= 0
(包括第零项);请注意,len( cardNumber ) == 16
是多余的,因为卡片的长度是恒定的:
while digit >= 0:
最后,您的信用卡号索引将不再需要负 1:
value = int(cardNumber[digit]) * 2
...
...
total = total + int(cardNumber[digit])
所以你的代码大部分是正确的,唯一的问题是你没有正确定义什么应该被认为是 "odd" 和 "even" 数字。当您从末尾读取数字时,"odd and even" 也是相对于末尾的,因此:
- 奇数从最后一个开始,然后每隔一个
- 偶数从最后一个开始,然后每隔一个
示例: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