Задание №25 — Проверка делимости
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих 108, найдите все числа, соответствующие маске ?19*8?3, делящиеся на 5171 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце - соответствующие результаты деления этих чисел на 5171.
Правильный ответ
11908813 2303 71995833 13923 81975863 15853 91955893 17783
Пояснение
Решение:
Перебирать подряд все числа до не нужно: искомое число обязано делиться на 5171, поэтому переберём сразу кратные — их всего , это мгновенно.
Проверку маски удобно поручить модулю fnmatch: в его шаблонах ? означает ровно один символ, а * — любую, в том числе пустую, последовательность символов, то есть ровно то, что написано в условии. Число превращаем в строку и сравниваем с маской ?19*8?3.
from fnmatch import fnmatch
for k in range(1, 10 ** 8 // 5171 + 1):
n = 5171 * k
if fnmatch(str(n), '?19*8?3'):
print(n, k)
Маска ?19*8?3: одна любая цифра, затем 19, затем произвольный (возможно, пустой) кусок, затем 8, любая цифра и 3 в конце. Программа находит 4 числа.
| Число | Частное от деления на 5171 |
|---|---|
| 11908813 | 2303 |
| 71995833 | 13923 |
| 81975863 | 15853 |
| 91955893 | 17783 |
Ответ: 11908813 2303 71995833 13923 81975863 15853 91955893 17783