Задание №25 — Проверка делимости
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 1?2139*4, делящиеся на 2023 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на 2023. Количество строк в таблице для ответа избыточно.
Правильный ответ
162139404 80148 1321399324 653188 1421396214 702618 1521393104 752048
Пояснение
Решение:
Перебирать все числа до не нужно: подходящие числа делятся на 2023, поэтому достаточно пройти по кратным — Их примерно в 2023 раз меньше.
Проверку маски удобно свести к регулярному выражению: символ «?» — это ровно один любой символ, то есть ., а символ «*» — любая (в том числе пустая) последовательность, то есть .*. Маска 1?2139*4 превращается в шаблон 1.2139.*4, и число подходит, если запись числа целиком совпадает с шаблоном.
Граница перебора — , поэтому среди ответов встречаются как девятизначные, так и десятизначные числа; в таблицу они записываются в порядке возрастания.
import re
pattern = '1.2139.*4'
d = 2023
k = d
while k <= 10 ** 10:
if re.fullmatch(pattern, str(k)):
print(k, k // d)
k += d
Программа выводит:
162139404 80148 1321399324 653188 1421396214 702618 1521393104 752048Ответ: 162139404 80148 1321399324 653188 1421396214 702618 1521393104 752048