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

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

Ответ: 154698 59 11468628 4374 12425658 4739 15401628 5874 16476648 6284 17433678 6649 19452618 7419

Условие

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

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

Найдите все натуральные числа, не превосходящие 108, для которых выполнены

все условия:

— соответствуют маске 1?4*6?8;

— делятся на 2622 без остатка.

В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, справа от каждого числа их частное от деления на 2622.

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

  1. Маска жёстко задаёт первую, третью и последние цифры числа, а между ними остаются свободные позиции. Шагай по числам, кратным делителю из условия, и проверяй строку целиком через fnmatch.
  2. Звёздочка может быть пустой, а может скрывать несколько цифр — не ограничивай её длину одним символом. В ответ пиши число и частное, а числа располагай по возрастанию.

Решение

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

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

from fnmatch import *

for x in range(0, 10**8, 2622):

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

if fnmatch(str(x), '1?4*6?8'):

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

print(x, x // 2622)

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

154698 59

11468628 4374

12425658 4739

15401628 5874

16476648 6284

17433678 6649

19452618 7419

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

from itertools import product

цифры = '0123456789'

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

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

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

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

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

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

for x in числа:

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

print(x,x//2622)

Приведём решение Сергея Донец на PascalABC.NET:

begin

var d:=2622;

foreach var x in Range(d, 10**8, d) do

if x.ToString.IsMatch('^1.4.*6.8$')//1?4*6?8

then Println(x, x/d);

end.

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

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

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