Python 卢恩斯算法

Python 卢恩斯算法,python,luhn,Python,Luhn,嘿,我在做学校作业的卢恩算法 一些输出是正确的;然而,有些情况并非如此 0004222222总共给了我44 及 0378282246310005总共给了我48 举几个例子 我知道我的代码不是最干净的,因为我是一个新手,但如果有人能找出我的错误,我会非常感激 这是我的密码: cardNumber = input( "What is your card number? ") digit = len(cardNumber) value = 0 total = 0 while ( len( cardNu

嘿,我在做学校作业的卢恩算法

一些输出是正确的;然而,有些情况并非如此

0004222222
总共给了我
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
(包括第0项);请注意,
len(cardNumber)==16
是冗余的,因为卡的长度是恒定的:

while digit >= 0:
最后,您的信用卡号索引将不再需要负1:

value = int(cardNumber[digit]) * 2
...
...
total = total + int(cardNumber[digit])

因此,您的代码基本上是正确的,唯一的问题是您没有正确定义应该被视为“奇数”和“偶数”的数字。当您从末尾读取数字时,“奇数和偶数”也与末尾相对,因此:

  • 奇数从最后一个开始,然后每隔一个开始
  • 偶数从倒数第二个开始,然后每隔一个开始
示例:1234表示EOEO,12345表示OEO(O表示奇数,E表示偶数)

这里是固定代码(我只修改了三行,请参见注释):


您能否提供更多关于这些输出不正确原因的详细信息?它们应该是什么?中有一个算法的python实现,您可以研究它并尝试看看是否能够识别问题。祝你一切顺利!非常感谢您的回复!至少我现在知道了。作业一个半小时前就要交了,我真是太傻了,现在才检查这个,哈哈。整晚都在树莓pi上为ps1玩暗黑破坏神/facepalm@BrianUpward在SO上接受有用的答案是表示感谢的另一种方式我必须单击SO等吗我必须单击某个东西才能接受它吗?我投了更高的票already@BrianUpward这很容易:)看到了吗
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