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

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

Ответ: 321657 159 34105757 16859 35117257 17359 36128757 17859 37140257 18359 38151757 18859 39163257 19359

Условие

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

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

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

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

Среди натуральных чисел, не превышающих 108, найдите все числа, соответствующие маске 3?1*57, делящиеся на 2023 без остатка.

В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 2023.

Количество строк в таблице для ответа избыточно.

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

  1. Числа в ответе идут по возрастанию, а во втором столбце — частное от деления на делитель из условия. Иди по числам, кратным делителю, и проверяй маску целиком через fnmatch.
  2. «?» — ровно одна цифра, «*» — любая последовательность цифр, в том числе пустая. Верхнюю границу превышать нельзя, а найденные пары выписывай строго в порядке возрастания числа.

Решение

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

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

from fnmatch import *

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

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

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

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

print(x, x // 2023)

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

321657 159

34105757 16859

35117257 17359

36128757 17859

37140257 18359

38151757 18859

39163257 19359

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

begin

var d := 2023;

var minMask := 30157;//maska минимальная 3?1*57

var maxMask := 391999957;

var maxLimit:= 100000000;

var start := minMask + (d - minMask mod d) mod d;

var finish:= Min(maxLimit, maxMask);

for var i := start to finish step d do

if i.ToString.IsMatch('^3.1.*57$') then

Println(i, i div d);

end.

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

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

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