Задание 25 ЕГЭ: маска числа
Маска числа с символами «?» и «*» и делимость. Тема номера — делители и маски чисел. Ниже — пример с ответом и решением; кнопкой под ним можно решить такую же задачу с другими числами, ответ проверится сразу.
Пример
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
- символ «?» означает ровно одну произвольную цифру;
- символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 108, найдите все числа, соответствующие маске 25*??3*8, делящиеся на 5208 без остатка.
В ответе запишите все найденные числа в порядке возрастания, справа от каждого числа — результат деления этого числа на 5208. Запишите каждую пару чисел с новой строки, числа — через пробел.
Ответ
25003608 4801; 25133808 4826; 25472328 4891; 25498368 4896; 25993128 4991Решение
В маске 6 обязательных символов (цифры и «?»), а числа, не превышающие 108, имеют не больше 8 цифр (само 108 маске не соответствует). Значит, обе «*» вместе могут означать от 0 до 2 цифр, и все числа по маске можно просто перебрать — их 32 100. Другой способ — перебирать кратные 5208 и сверять запись с маской через fnmatch; кратных 5208 до 108 около 19 201, так что и это быстро. Одно и то же число может получиться при разных разбиениях цифр между двумя «*», поэтому складываем найденные числа в множество.
from itertools import product
digits = "0123456789"
found = set()
for q in product(digits, repeat=2): # цифры на местах «?»
for k1 in range(3):
for k2 in range(3 - k1): # обе «*» вместе — не больше 2 цифр
for mid1 in product(digits, repeat=k1):
for mid2 in product(digits, repeat=k2):
s1, s2 = "".join(mid1), "".join(mid2)
n = int(f"25{s1}{q[0]}{q[1]}3{s2}8")
if n <= 10**8 and n % 5208 == 0:
found.add(n)
for n in sorted(found):
print(n, n // 5208)Ответ:
25003608 4801
25133808 4826
25472328 4891
25498368 4896
25993128 4991