2015-09-12 51 views
1

Это мой код для алгоритма Луна (проверка кредитной карты). Это хорошо ...Это самый эффективный способ написать алгоритм Луна в Python?

card = raw_input("Enter your credit card number here: ") 
card = list(str(card)) 
card = [int(x) for x in card] 
check = card[-1] 
del(card[-1]) 
card[::2] = [2*x for x in card[::2]] 
for i, x in enumerate(card): 
     card[i] = sum(map(int, str(x))) 
card = sum(card) * 9 
card = list(str(card)) 
card = [int(x) for x in card] 
if card[-1] == check: 
    print("Card is valid!") 
else: 
    print("Card is invalid!") 

Или я могу сделать его короче/более эффективным?

+0

Это чрезвычайно странный способ его написания, и это определенно не самый эффективный. Как насчет использования одного цикла? – Ryan

+0

Как это странно? Итерация проходит через каждый шаг ясно. –

ответ

1

Похоже, вы вычисляете значение контрольной цифры, чтобы проверить число, но вам не нужно это делать. Точка контрольной цифры состоит в том, что она дает конкретный результат - число, делящееся на 10, в сочетании с остальными числами.

Вы можете сделать все это в одном цикле и без каких-либо промежуточных списков, и самый простой способ объяснить, что это:

card = raw_input("Enter your credit card number here: ") 
digit_sum = 0 

for i, digit in enumerate(reversed(card)): 
    n = int(digit) 

    if i % 2 == 0: 
     digit_sum += n 
    elif i >= 5: 
     digit_sum += n * 2 - 9 
    else: 
     digit_sum += n * 2 

if digit_sum % 10 == 0: 
    print("Card is valid!") 
else: 
    print("Card is invalid!") 
0

Функция номер тестовой карты под Лун алгоритму:

def Luhn(card_number): 
    sum = 0 
    num_digits = len(card_number) 
    oddeven = num_digits & 1 
    for count in range(0, num_digits): 
     digit = int(card_number[count]) 
     if not ((count & 1)^oddeven): 
      digit = digit * 2 
     if digit > 9: 
      digit = digit - 9 
     sum = sum + digit 
    if sum % 10 == 0: 
     print("Card is valid!") 
    else: 
     print("Card is invalid!") 
Смежные вопросы