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)