2015-10-23 5 views
0

Мой вывод кода неправильный, хотя я не могу понять, почему. Если кто-то может пролить свет на мою проблему, я был бы очень признателен.Проверка номеров кредитных карт в python

Для назначения мы должны разрешить пользователю вводить номер кредитной карты на 15 или 16 цифр и возвращать ли действительный номер.

Мы используем тест Луна для проверки номера, и это не работает, когда мой код не работает. номер карты 4222222222222220 должен вернуться как действительный, но мой не работает, и я верю в это, потому что я не совсем понимаю, что должен делать код.

Test Лун в: Допустим, что номер кредитной карты был сделан из следующих цифр:

d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0

последней цифре, d0 является контрольной цифрой в алгоритме Луна. Алгоритм выглядит следующим образом:

Multiply все нечетные цифры 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 раз и 8 разрядов с 0 по 14).

Теперь, если числа расположены в нечетных местах, вы умножаетесь на 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
Прокрутка вниз с алгоритмом Лун в. Он охватывает пример