Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 3?12?14*5, делящиеся на 1917 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания,
а во втором столбце – соответствующие им результаты деления этих чисел на 1917.
Количество строк в таблице для ответа избыточно.
Решение
🔹 Шаг 1. Понимание условия и идеи решения
📌 Нужно найти такие натуральные числа:
💡 Чтобы не проверять все числа подряд, перебираем только числа, кратные 1917, и для каждого проверяем маску.
🔹 Шаг 2. Подключаем модуль для работы с масками
from fnmatch import *
📌 Модуль fnmatch проверяет строку на соответствие маске, где ? — ровно один любой символ, * — любая последовательность символов (в том числе пустая).
🔹 Шаг 3. Перебираем только числа, кратные делителю
for x in range(0, 10**10 + 1, 1917):
# перебираем числа, кратные 1917
📌 Что здесь происходит:
Так мы сразу выполняем одно из условий задачи.
🔹 Шаг 4. Проверяем соответствие маске
if fnmatch(str(x), '3?12?14*5'):
# проверяем соответствие маске
📌 Объяснение:
число x переводим в строку;
проверяем, подходит ли строка под маску 3?12?14*5 (символы ? и * работают как в условии).
🔹 Шаг 5. Выводим число и результат деления
print(x, x // 1917)
📌 Если число кратно делителю и соответствует маске, выводим само число и результат его деления на делитель из условия.