Задание №25 — Проверка делимости
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 1*34?5?9, делящиеся на 31007 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие результаты деления этих чисел на 31007. Количество строк в таблице для ответа избыточно.
Правильный ответ
1260341529 40647 1291348529 41647 1300340559 41937 1331347559 42937 1371346589 44227
Пояснение
Решение:
Перебирать подряд все числа до не нужно: искомое число обязано делиться на 31007, поэтому переберём сразу кратные — их всего , это мгновенно.
Проверку маски удобно поручить модулю fnmatch: в его шаблонах ? означает ровно один символ, а * — любую, в том числе пустую, последовательность символов, то есть ровно то, что написано в условии. Число превращаем в строку и сравниваем с маской 1*34?5?9.
from fnmatch import fnmatch
for k in range(1, 10 ** 10 // 31007 + 1):
n = 31007 * k
if fnmatch(str(n), '1*34?5?9'):
print(n, k)
Маска 1*34?5?9 читается так: первая цифра 1, дальше произвольный (возможно, пустой) кусок, затем 34, любая цифра, 5, любая цифра и 9 в конце. Программа находит 5 чисел.
| Число | Частное от деления на 31007 |
|---|---|
| 1260341529 | 40647 |
| 1291348529 | 41647 |
| 1300340559 | 41937 |
| 1331347559 | 42937 |
| 1371346589 | 44227 |
Ответ: 1260341529 40647 1291348529 41647 1300340559 41937 1331347559 42937 1371346589 44227