17. Проверка номера кредитки.
Условие:
Последняя цифра номера банковской карты (и некоторых других номеров карт и счетов) - это всегда контрольная сумма, которая считается по алгоритму Луна. Таким образом, если пользователь ошибётся в одной цифре или перепутает две цифры местами, то это легко вычислить на стороне терминала, не делая запрос в банк.
Пользователь вводит номер кредитной карты (16-значное целое число), а программа вычисляет и проверяет контрольную сумму, и говорит, валидный номер или нет.
Алгоритм подсчёта суммы:
- цифры проверяемой последовательности нумеруются справа налево (Последняя цифра тоже считается, её номер - единица).
- цифры, оказавшиеся на нечётных местах, остаются без изменений.
- цифры, стоящие на чётных местах, умножаются на 2.
- если в результате такого умножения возникает число больше 9, оно заменяется суммой цифр получившегося произведения — однозначным числом, то есть цифрой.
- все полученные в результате преобразования цифры складываются. Если сумма кратна 10, то исходные данные верны.
Примеры корректных номеров:
5019 5555 4444 5555
8171 9999 0000 0000 021
4917 4845 8989 7107
6011 5564 4857 8945 8
5425 2334 3010 9903
Код:
number_credit = input("Введите номер кредитной карты в формате xxxxxxxxxxxxxxxx ")
number_credit = number_credit[::-1] # перевернём строку
number_credit_first = number_credit[0::2] # создадим строку только с нечётными цифрами
number_credit_second = number_credit[1::2] # создадим строку только с чётными цифрами
# посчитаем сумму цифр на нечётных местах
amount = list(number_credit_first) # преобразуем строку в список
amount = sum([int(i) for i in amount]) # посчитаем сумму всех цифр на нечётных местах
# посчитаем сумму цифр на чётных местах с необходимым модом
amount_2 = list(number_credit_second) # преобразуем строку в список
amount_2 = [int(i) for i in amount_2] # поменяем значения в списке со str на int
for i in amount_2:
i *= 2
if i > 9:
amount += i // 10 + i % 10
else:
amount += i
result = "Карта валидна" if amount % 10 == 0 else "Карта не валидна"
print(result)