2015-10-23 427 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的算法。它包含一個示例