Задание №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.
Количество строк в таблице для ответа избыточно.
Подсказки — как подойти к решению
- Числа в ответе идут по возрастанию, а во втором столбце — частное от деления на делитель из условия. Иди по числам, кратным делителю, и проверяй маску целиком через fnmatch.
- «?» — ровно одна цифра, «*» — любая последовательность цифр, в том числе пустая. Верхнюю границу превышать нельзя, а найденные пары выписывай строго в порядке возрастания числа.
Решение
Будем последовательно рассматривать каждое целое число, кратное 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 по информатике