Пример 1
Назовём маской числа последовательность цифр, в которой также могут встречаться символы:
? — ровно одна произвольная цифра;
* — любая последовательность цифр произвольной длины, в том числе пустая.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Найдите все натуральные числа, не превышающие 10¹⁰, которые соответствуют маске 1?2139*4 и делятся на 2023 без остатка. В ответе запишите найденные числа в порядке возрастания, справа от каждого — результат его деления на 2023.
Показать решение и ответ
1. Перебирать все числа до 10¹⁰ слишком долго. Перебираем только кратные 2023 — их в 2023 раза меньше.
2. Проверку маски берём из модуля fnmatch: в нём ? и * означают то же, что в условии.
from fnmatch import fnmatch # fnmatch понимает маски с ? и *
for k in range(2023, 10**10 + 1, 2023): # перебираем только числа, кратные 2023
if fnmatch(str(k), '1?2139*4'): # число подходит под маску
print(k, k // 2023) # число и частное от деления на 2023Программа работает несколько секунд — это нормально.
Ответ: 162139404 80148 1321399324 653188 1421396214 702618 1521393104 752048
