Задание №25 — Проверка делимости
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 109, найдите все числа, соответствующие маске 33*21?7, делящиеся на 2079 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 2079. Количество строк в таблице для ответа избыточно.
Правильный ответ
336222117 161723 337012137 162103 337802157 162483 338592177 162863 339382197 163243
Пояснение
Решение:
Перебирать подряд все числа до не нужно: искомое число обязано делиться на 2079, поэтому переберём сразу кратные — их всего , это мгновенно.
Проверку маски удобно поручить модулю fnmatch: в его шаблонах ? означает ровно один символ, а * — любую, в том числе пустую, последовательность символов, то есть ровно то, что написано в условии. Число превращаем в строку и сравниваем с маской 33*21?7.
from fnmatch import fnmatch
for k in range(1, 10 ** 9 // 2079 + 1):
n = 2079 * k
if fnmatch(str(n), '33*21?7'):
print(n, k)
Маска 33*21?7: число начинается на 33, затем произвольный (возможно, пустой) кусок, затем 21, любая цифра и 7 в конце. Программа находит 5 чисел; обратите внимание, что все они идут с шагом .
| Число | Частное от деления на 2079 |
|---|---|
| 336222117 | 161723 |
| 337012137 | 162103 |
| 337802157 | 162483 |
| 338592177 | 162863 |
| 339382197 | 163243 |
Ответ: 336222117 161723 337012137 162103 337802157 162483 338592177 162863 339382197 163243