Задание №25 ЕГЭ Информатика с ответом и решением
Ответ: 1271361 4657 12633621 46277 12663651 46387 12693681 46497
Условие
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 108, найдите все числа, соответствующие маске 12??36*1, делящиеся на 273 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 273.
Количество строк в таблице для ответа избыточно.
Подсказки — как подойти к решению
- Перебор с шагом, равным делителю, избавляет от проверки делимости: останется только понять, сколько разрядов может быть у числа и как выглядит маска.
- Ограничение из условия показывает, что на месте звёздочки помещается лишь несколько цифр; два «?» — это ровно по одной цифре каждый, поэтому цифры на их местах удобно перебрать вложенными циклами, а для звёздочки отдельно рассмотреть случай пустой последовательности.
- Не забудь про форму ответа: для каждого найденного числа в таблице нужны два значения — само число и результат его деления на делитель, причём строки идут по возрастанию чисел.
Решение
Будем последовательно рассматривать каждое целое число, кратное 273. затем каждое число проверять на соответствие маске.
Приведём решение на языке Python.
from fnmatch import *
for x in range(0, 10**8, 273): # Перебераем все числа от 0 с шагом 273, будут полученны числа кратные 273
if fnmatch(str(x), '12??36*1'):# Проверяем полученное число соответствию заданию
print(x, x // 273)
В результате работы программа должна вывести следующее:
1271361 4657
12633621 46277
12663651 46387
12693681 46497
Приведём решение Евгения Джобса.
Заметим, что при ограничении до 108 на месте звездочки может стоять не больше одного разряда. Поэтому достаточно перебрать два варианта — пустая строка на месте звездочки и 1 символ на месте звездочки.
for a in range(10):
for b in range(10):
x = 12*10**5 + a*10**4 + b*10**3 + 361
# можно заменить на
# x = int(f'12{a}{b}361')
if x % 273 == 0:
print(x, x // 273)
for a in range(10):
for b in range(10):
for c in range(10):
x = 12*10**6 + a*10**5 + b*10**4\
+ 36*100 + c*10 + 1
# можно заменить на
# x = int(f'12{a}{b}36{c}1')
if x % 273 == 0:
print(x, x // 273)
Приведём решение Юрия Красильникова на языке Python.
d = '0123456789'
nums = sorted([int(f'12{x}{y}36{s}1') for x in d for y in d for s in ['']+list(d)])
for x in nums:
if x % 273 == 0:
print(x,x//273)
Приведём решение Ильи Крылова на языке Python.
w = ['']+[i for i in '0123456789']
numbers = []
for x in '0123456789':
for y in '0123456789':
for z in w:
number = int('12'+x+y+'36'+z+'1')
numbers.append(number)
numbers = sorted(numbers)
for number in numbers:
if number % 273 == 0:
print(number, number // 273)
Приведём решение Артёма Гридина на языке Python.
for i in range(0, 10**8, 273):
s = str(i)
if s[0:2] == '12' and s[4:6] == '36' and s[-1] == '1':
print(s, i//273)
Приведём решение Сергея Донец на PascalABC.NET:
begin
var d := 273;
var minMask := 1200361;
var maxMask := 129_936_991;
var maxLimit:= 100_000_000;
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('^12..36.*1$') then
Println(i, i div d);
end.
Типичные ошибки
- Потеряно число с пустой звёздочкой: «*» может задавать и нуль цифр, поэтому такой кандидат тоже подходит под маску и должен попасть в ответ.
- Выведен только первый столбец таблицы: рядом с каждым числом должен стоять результат деления на делитель.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №25 по информатике