4. Проверка номера кредитки (в коде есть строки из следующих тем: "строки").
Условие:
Последняя цифра номера банковской карты (и некоторых других номеров карт и счетов) - это всегда контрольная сумма, которая считается по алгоритму Луна. Таким образом, если пользователь ошибётся в одной цифре или перепутает две цифры местами, то это легко вычислить на стороне терминала, не делая запрос в банк.
Пользователь вводит номер кредитной карты (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_card = input("Введите номер кредитной карты (можно с пробелами или без них): ")
# уберём пробелы, если они есть и превратим номер карты в число типо int
if " " in number_card:
number_card = number_card.replace(" ", "")
number_card = int(number_card)
parity = 1 # введём переменную "чётность", кот. начинается с 1, прибавляя в цикле 1, будем определять чётность
parity_mod = str() # переменная для значения чётности
amount = 0 # в этой переменной будем копить сумму цифр
while number_card != 0: # запустим цикл с условием отмены: будем уменьшать номер карты до 0, как только номер достигнет 0 цикл прекращается
parity_mod = "yes" if parity % 2 == 0 else "no" # создадим условие поиска чётности отдельной строкой
parity += 1 # прибавляем 1 для определения чётности
next_digit = number_card % 10 # достанем цифру из номера
next_digit = (next_digit * 2) if parity_mod == "yes" else next_digit # произведём умножение цифры на 2, если она чётная
next_digit = (next_digit % 10 + next_digit // 10) if next_digit > 9 else next_digit # модификация четной цифры, если в процессе её умножения на 2 получилось число более 9
amount += next_digit # копим сумму
number_card //= 10 # используем оперцию целочисленного деления для уменьшения порядка цифры
result = "Карта валидна" if amount % 10 == 0 else "Карта не валидна"
print()
print(result)