2015-10-23 426 views
0

即使我看不出为什么,我的代码输出也是不正确的。如果有人能够解释我的问题,我会非常感激。在python中验证信用卡号码

对于作业,我们允许用户输入15或16位数的信用卡号码并返回给定的号码是否有效。

我们正在使用Luhn的测试来验证数字,这是我的代码不工作的地方。卡号4222222222222220应该返回有效,但我的工作不正常,我相信它,因为我不完全理解代码的意图。

卢恩的测试:让我们说,信用卡号码作出的以下数字:

D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0

最后一位D0是Luhn算法中的校验数字。该算法去如下:

乘所有的奇数位D1,D3,D15 ......由2

总和每种产品的数字。

现在添加所有的偶数位d0,... d14和奇数位的单数位产品。

如果最后的总和可以被10整除,那么信用卡是有效的,否则它是无效的。

我的代码是:

def len_check(x): 
    length = len(str((x))) 
    if (length == 15) or (length == 16): 
    return True 
    else: 
    return False 

def is_valid(x): 
    card = x 
    num_list= list((str(card))) 
    sum_odd = 0 
    sum_even = 0 
    even_count = 0 
    odd_count = 0 
    total_sum = 0 
    length = 0 
    for i in num_list: 
    length += 1 
    print(length) 
    count = 0 
    if length == 16: 
    odd_count = 15 
    even_count = 14 
    if length == 15: 
    odd_count = 13 
    even_count = 14 
    print(even_count) 
    print(odd_count) 

    while (count <= length-2): 

    print('even count', even_count) 
    print('D-even', num_list[even_count]) 
    sum_even += int(num_list[even_count]) 
    even_count -=2 
    print('sum even', sum_even) 

    print('odd count', odd_count) 
    print('D-odd', num_list[odd_count]) 
    prod = 2 * int(num_list[odd_count]) 
    sum_odd += prod 
    odd_count -=2 
    print('sum odd', sum_odd) 

    count +=2 

    total_sum = sum_odd + sum_even 
    print('total sum', total_sum) 

    if total_sum % 10 == 0: 
    return True 
    else: 
    return False 



def main(): 
    cc_num = int(input('Enter at 15 or 16-digit credit card number: ')) 

    if not len_check(cc_num): 
    print('Not a 15 or 16-digit number') 
    else: 
    if not is_valid(cc_num): 

     print('Invalid credit card number') 
    else: 
     print('valid card number') 



main() 
+1

您可能想突出显示您的实际问题,在所有情况中很难发现。 – ShadowRanger

+0

让我试着帮忙:你有什么尝试?你有没有确定'sum_even'和'sum_odd'是你期望得到的款项?怎么样? – alf

+0

就我所了解的程序的要求而言,就像我在手工操作时一样,我是对的,我相信问题在于我理解测试应该如何工作。 – Rsherrill

回答

2

程序没有出现非常明确的逻辑给我。首先不清楚为什么你只会循环到长度为2;如果有15位数字,您可能会错过一位数字作为长度,您甚至会错过一位数字(循环运行7次,并且从0到14有8位偶数位)。

现在如果数字位于奇数位置,您将乘以2并直接添加它们。根据算法,你应该把数字加起来然后加上。所以如果奇数的数字是9和2 * 9 = 18;那么你应该添加数字(给出1 + 8),然后将其添加到sum_add。这是我注意到的另一个缺陷。

还有一件事;为了计算列表的长度,你可以使用len(num_list)。你也应该使用list.reverse来反转这个列表,因为在15位数字的情况下,你将会遇到问题。

如果您使用列表理解,您可以使您的程序更好。像这样的东西

num_list = num_list.reverse 
even_list = [num_list[i] for i in xrange(0,len(num_list),2)] 
odd_list = [num_list[i] for i in xrange(1,len(num_list),2)] 

这将隔离你的偶数和你可以相应地进行。 也可以找到数字的总和,你可以检查一个数字是否大于9.如果它是更大的减去9,你会得到你的总和。

你可以通过这个链接来获得算法 Luhn's Algorithm
滚动的理解下到LUHN的算法。它包含一个示例