Задание №25 ЕГЭ Информатика с ответом и решением
Ответ: 123450798 5367426 123451718 5367466 123453788 5367556 123454708 5367596 123456778 5367686 123459768 5367816
Условие
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 109, найдите все числа, соответствующие маске 12345?7?8, делящиеся на число 23 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 23.
Количество строк в таблице для ответа избыточно.
Подсказки — как подойти к решению
- Задание решается перебором, но перебирать все натуральные числа подряд долго: выбирай между перебором только чисел, подходящих под маску, и перебором только чисел, кратных делителю. Оцени, каких кандидатов получится меньше, и иди этим путём.
- Разбери маску посимвольно: «?» — ровно одна любая цифра, «*» — любая последовательность цифр, в том числе пустая. Здесь звёздочки нет, значит маска жёстко задаёт и число разрядов, и границы диапазона кандидатов — найди их до начала перебора.
- На последнем шаге для каждого кандидата проверь делимость без остатка и выведи подряд два значения: само число, а за ним результат деления на делитель. Строки таблицы располагай по возрастанию чисел.
Решение
Решим данную задачу методом перебора. Заметим, что маске «12345?7?8» соответствуют числа от 123450708 до 123459798. Для каждого числа будем проверять, что третья справа цифра равна 7 и последняя цифра числа равна 8. Для каждого такого числа будем проверять, кратно ли оно 23, если число кратно 23 — будем выводить его на экран, а также результат деления этого числа на 23.
Приведём решение на языке Pascal.
var
i: longint;
begin
for i := 123450708 to 123460000 do begin
if (((i mod 1000) div 100) = 7) and (i mod 10 = 8) then
if i mod 23 = 0 then writeln(i, ' ', i div 23);
end;
end.
Приведём решение на языке Python.
for i in range(123450708,123460000):
if (i%23==0) and (i%10==8) and ((i//100)%10==7):
print(i, i//23)
В результате работы программа должна вывести следующее:
123450798 5367426
123451718 5367466
123453788 5367556
123454708 5367596
123456778 5367686
123459768 5367816
Приведём решение Вагнерова Ивана на языке Python.
from fnmatch import *
for x in range(0,10**9,23):
if fnmatch(str(x), '12345?7?8'):
print(x, x//23)
Приведём решение Юрия Красильникова на языке Python.
d = '0123456789'
ans = sorted([int(f'12345{x}7{y}8') for x in d for y in d])
for x in ans:
if x%23==0:
print(x,x//23)
Приведём решение Сергея Донец на PascalABC.NET:
begin
var x:=123450708;//maska минимальная 12345?7?8
var d:=23;//шаг = делитель
var start:=x+(d-x mod d) mod d;// первое число >= x, кратное шагу
var finish:=123459798;//maska максимальная 12345?7?8
for var i:=start to finish step d do
if i.tostring.IsMatch('^12345.7.8$') then
Println(i,i/23);
end.
Типичные ошибки
- Заполнен только первый столбец: по условию рядом с каждым числом должен стоять результат его деления на делитель. Проверь, что программа печатает в одной строке оба значения.
- Столбцы перепутаны: первым в таблице идёт само найденное число, а вторым — результат деления. Следи за порядком аргументов в команде вывода.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №25 по информатике