4

嘿,我正在为学校的作业做 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
4

2 回答 2

2

你几乎做对了。对于您的 16 位卡,只有最后一位(或后面的第一位)应被视为奇数。所以你应该设置:

digit = len(cardNumber) - 1

然后你的while条件应该停在>= 0(包括第零项);请注意,这len( cardNumber ) == 16是多余的,因为卡的长度是恒定的:

while digit >= 0:

最后,您的信用卡号索引将不再需要负 1:

value = int(cardNumber[digit]) * 2
...
...
total = total + int(cardNumber[digit])
于 2016-10-16T22:19:44.490 回答
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
于 2016-10-16T22:57:11.970 回答