9. Проверка номера кредитки (в коде есть строки из следующих тем: "строки").
Условие:
Последняя цифра номера банковской карты (и некоторых других номеров карт и счетов) - это всегда контрольная сумма, которая считается по алгоритму Луна. Таким образом, если пользователь ошибётся в одной цифре или перепутает две цифры местами, то это легко вычислить на стороне терминала, не делая запрос в банк.
Пользователь вводит номер кредитной карты (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] # перевернём строку
count = 0 # счётчик для определения чётности
amount = 0 # копим сумму
for i in number_credit: # обойдём все цифры в числе в цикле
count += 1 # прибавляем 1 для определения четности с след. условии
if count % 2 == 0: # условие для определения чётности
i = int(i) * 2 # умножаем цифру, если она на чётном месте на 2
if i > 9: # проверка, если произведение числа на четном месте на 2 оказалось больше 9
amount += i % 10 + i // 10 # копим сумму модификацией числа в случае, если его произведение на 2 оказалось более 9
else:
amount += i # копим сумму произведением числа на 2, кот. не подвергалось модификации
else:
amount += int(i) # копим сумму
result = "Карта валидна" if amount % 10 == 0 else "Карта не валидна"
print(result)