Задание №25 — Проверка делимости
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 109, найдите все числа, соответствующие маске 32*21?4, делящиеся на 2049 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 2049. Количество строк в таблице для ответа избыточно.
Правильный ответ
321992154 157146 324082134 158166 326172114 159186 329102184 160616
Пояснение
Решение:
Перебирать все числа до не нужно: подходящие числа делятся на 2049, поэтому достаточно пройти по кратным — Их примерно в 2049 раз меньше.
Проверку маски удобно свести к регулярному выражению: символ «?» — это ровно один любой символ, то есть ., а символ «*» — любая (в том числе пустая) последовательность, то есть .*. Маска 32*21?4 превращается в шаблон 32.*21.4, и число подходит, если запись числа целиком совпадает с шаблоном.
import re
pattern = '32.*21.4'
d = 2049
k = d
while k <= 10 ** 9:
if re.fullmatch(pattern, str(k)):
print(k, k // d)
k += d
Программа выводит:
321992154 157146 324082134 158166 326172114 159186 329102184 160616Ответ: 321992154 157146 324082134 158166 326172114 159186 329102184 160616