πЕГЭ · ИИ-репетитор12 предметов · задания ФИПИ
Главная → Информатика → Задания №25 → Задание i25-13

Задание №25 ЕГЭ Информатика с ответом и решением

Ответ: 100430211 176430261 1374430221 1450430271 1973430201

Условие

Маска числа — это последовательность цифр, в которой могут встречаться специальные символы «?» и «*». Символ «?» означает ровно одну произвольную цифру, символ «*» означает произвольную (в том числе пустую) последовательность цифр.

Например, маске 123*4?5 соответствуют числа 123405 и 12376415.

Найдите все натуральные числа, не превышающие 1010, которые соответствуют маске 1*4302?1 и при этом без остатка делятся на 3147. В ответе запишите все найденные числа в порядке возрастания.

Подсказки — как подойти к решению

  1. Маска начинается с единицы, затем идёт свободная последовательность цифр, фиксированный блок, одна произвольная цифра и завершающая единица. Проверяй всю строку целиком, а не отдельные её куски.
  2. Среди подходящих чисел есть и короткие, и десятизначные: звёздочка может быть пустой или длинной. Перебирай кратные делителю из условия и не забудь про верхнюю границу.

Решение

Будем последовательно рассматривать каждое целое число, кратное 3147, затем каждое число проверять на соответствие маске.

Приведём решение на языке Python.

from fnmatch import *

for x in range(0, 10**10, 3147):

# Перебираем все числа от 0 с шагом 3147, будут получены числа кратные 3147

if fnmatch(str(x), '1*4302?1'):

# Проверяем полученное число соответствию заданию

print(x)

В результате работы программа должна вывести следующее:

100430211

176430261

1374430221

1450430271

1973430201

Приведём решение Юрия Красильникова на языке Python.

from itertools import product

цифры = '0123456789'

# Т. к. число < 10**10 (число 10**10, очевидно, не соответствует маске),

# то последовательность на месте "*" не может быть длиннее 3.

звезды = [''.join(x) for длина in range(4) for x in product(цифры,repeat=длина)]

# звезды - все строки из цифр длиной от 0 до 3

числа = sorted([int(f'1{зв}4302{ц}1') for зв in звезды for ц in цифры])

# числа - сортированный список всех чисел меньше 10**10, отвечающих маске

for x in числа:

if x%3147 == 0: # если число делится на 3147 - печатаем

print(x)

Ответ: 100430211&176430261&1374430221&1450430271&1973430201

Типичные ошибки

Решить это задание в тренажёре

В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №25 по информатике