Задание 25 ЕГЭ по информатике 2027: делители и маски чисел
- Раздел
- Алгоритмы и программирование
- Максимальный балл
- 1 балл
- Уровень
- высокий
- Что проверяет
- Умение создавать собственные программы (10–20 строк) для обработки целочисленной информации
- Что нужно сделать
- Написать программу перебора: найти числа из диапазона с заданными делителями или подходящие под маску.
- Как записать ответ
- таблица: по строке на каждое найденное число, два числа в строке — в порядке из условия
- Время
- Около 20 минут по обобщённому плану ФИПИ
- Элемент кодификатора
- 3.4
- Компьютер
- Нужна программа или электронная таблица: на станции КЕГЭ — среды программирования на C#, C++, Pascal, Java, Python и редактор таблиц
- Файл к заданию
- Нет — все данные в условии
- В 2026 году
- Тоже задание 25
Задание 25 ЕГЭ по информатике 2027 года проверяет, по формулировке обобщённого плана ФИПИ, «умение создавать собственные программы (10–20 строк) для обработки целочисленной информации». Уровень высокий: за верный ответ даётся 1 балл, частичного балла нет, по обобщённому плану на задание отводится около 20 минут. В КИМ 2026 года под этим номером стояло то же задание — смена тем 2027 года коснулась только заданий 10, 13 и 23.
Файла к заданию не прилагается: диапазон чисел, условие на них и форма ответа записаны прямо в условии, а специализированное ПО обобщённым планом предусмотрено — нужна среда программирования. Ответ вводится в таблицу станции КЕГЭ: по строке на каждое найденное число, и в строке два числа в том порядке, который задан условием — для произведения двух простых это само число и его наименьший множитель, для чисел по маске число и частное от деления, для суммы делителей число и значение M.
Результаты 2026 года низкие: средний процент выполнения — 10,9, и в методических рекомендациях ФИПИ по итогам 2026 года приведено: «Средний процент выполнения в группе 3 – 5,94, в группе 4 – 45,3». Умение создавать собственные программы (10–20 строк) для обработки целочисленной информации названо там среди затруднений на повышенном и высоком уровне, а в выводах рекомендаций сказано: «необходимо уделить особое внимание: практическому программированию, включая работу с файлами при вводе/выводе данных, работу с массивами, сортировку, обработку числовой и символьной информации, поиск путей в графах; организации вычислений в электронных таблицах». Ниже — три типа задания с разбором и решением на Python, разбор демоверсии 2027 года и типичные ошибки.
Тренажёр задания 25
Десять заданий номера 25 из банка тренажёра — с файлами, как на станции КЕГЭ. Решайте в песочнице Python прямо на странице или у себя; ответ проверяется по ключу, после проверки — верный ответ, разбор и решение на Python, а при ошибке — разбор от ИИ. Кнопка «Ещё 5 таких» у типа задания ниже даёт задания одного типа.
Задание 25 вместе с остальными — в вариантах целиком.
Типы задания 25 с решением
Произведение двух простых множителей с условием на запись
Напишите программу, которая перебирает целые числа, бо́льшие 271 842 425, в порядке возрастания и ищет среди них числа вида p · q, где p ≤ q — простые, каждый из которых ровно один раз содержит в своей записи 94 (идущие подряд цифры 9 и 4). В первом столбце таблицы запишите первые 5 найденных чисел в порядке возрастания, во втором — наименьший найденный множитель.
1. Меньший из двух простых множителей не превосходит \√n, поэтому заранее выписываем простые числа с одним «94» до 20 000. 2. Идём по числам от границы вверх и пробуем делители из этого списка по возрастанию: первое найденное p — наименьший множитель. 3. Частное q = n // p проверяем на простоту и на ровно одно «94» в записи. 4. Набрали пять чисел — останавливаемся: перебор шёл по возрастанию.
На примере: 271 852 367 = 1949 · 139 483; оба множителя простые с одним «94», поэтому первая строка — 271 852 367 и 1949. Дальше идут 271 858 021 (3943), 271 860 163 (1949), 271 871 857 (1949) и 271 899 127 (941).
START = 271842425
PATTERN = '94'
COUNT = 5
P_LIMIT = 20000 # меньший множитель не больше корня из числа
def has_pattern(n):
# ровно одно вхождение PATTERN в десятичную запись
return str(n).count(PATTERN) == 1
def is_prime(n):
if n < 2:
return False
d = 2
while d * d <= n:
if n % d == 0:
return False
d += 1
return True
# Меньший из двух простых множителей не превосходит корня из числа, поэтому
# заранее заготовим простые числа с одним «94» в записи.
small = [p for p in range(2, P_LIMIT + 1) if has_pattern(p) and is_prime(p)]
found = []
n = START + 1
while len(found) < COUNT:
for p in small:
if p * p > n: # p больше корня — меньшим множителем быть не может
break
if n % p == 0:
q = n // p
if has_pattern(q) and is_prime(q):
found.append((n, p)) # первое найденное p — наименьший множитель
break
n += 1
for x, p in found:
print(x, p)
Ответ: 271852367 1949 271858021 3943 271860163 1949 271871857 1949 271899127 941
Числа по маске, делящиеся на заданное число
Назовём маской числа последовательность цифр, в которой могут встречаться «?» (ровно одна произвольная цифра) и «*» (любая последовательность цифр произвольной длины, в том числе пустая). Например, маске 3?12*4 соответствуют 30 124 и 3 012 004. Среди натуральных чисел, не превышающих 1010, найдите все числа по маске 1?67?81*8, делящиеся на 2151. В первом столбце таблицы запишите найденные числа по возрастанию, во втором — результаты деления на 2151.
1. Разбираем маску по «*»: перед звёздочкой «1?67?81», после неё «8». 2. Перебираем длину цепочки вместо «*» от 0 до 2 (иначе число перевалит за 1010), её значение и две цифры вместо «?». 3. Собранную строку переводим в int и оставляем числа, кратные 2151, записывая рядом частное. 4. Найденное сортируем по возрастанию.
На примере: цифры вместо «?» — 0 и 8, цепочка — 15; получается 1 067 881 158, оно делится на 2151, частное 496 458 — первая строка ответа. Всего таких чисел десять, до 1 967 881 068.
MASK = '1?67?81*8'
DIVISOR = 2151
LIMIT = 10 ** 10
# «?» — ровно одна цифра, «*» — любая цепочка цифр, в том числе пустая.
front, back = MASK.split('*') # '1?67?81' и '8'
free = 10 - len(front) - len(back) # длиннее двух цифр цепочка не влезет
found = []
for r in range(free + 1): # длина цепочки вместо «*»
for star in range(10 ** r):
chain = str(star).zfill(r) # цепочка из r цифр, в том числе с нулями
for a in '0123456789':
for b in '0123456789':
# подставляем цифры вместо двух «?» по порядку слева направо
text = front.replace('?', a, 1).replace('?', b, 1) + chain + back
n = int(text)
if n <= LIMIT and n % DIVISOR == 0:
found.append((n, n // DIVISOR))
for n, q in sorted(found):
print(n, q)
Ответ: 1067881158 496458 1167881148 542948 1267881138 589438 1367881128 635928 1467881118 682418 1567881108 728908 1667881098 775398 1767881088 821888 1867881078 868378 1967881068 914868
Сумма наименьшего и наибольшего собственных делителей
Пусть M — сумма минимального и максимального натуральных делителей числа, не считая единицы и самого числа; если таких делителей нет, M равно нулю. Напишите программу, которая перебирает целые числа, бо́льшие 1 186 000, в порядке возрастания и ищет такие, для которых M оканчивается на 8. В первом столбце таблицы запишите первые пять найденных чисел по возрастанию, во втором — значения M. Например, для числа 20 M = 2 + 10 = 12.
1. Для каждого числа от границы вверх ищем наименьший делитель, больший единицы: пробуем 2, затем нечётные до \√n. У простого числа такого делителя нет, а собственных делителей у него нет, поэтому M = 0. 2. Наименьший делитель p всегда прост, а наибольший собственный делитель — это n // p, значит M = p + n // p. 3. Если M оканчивается на нужную цифру, число идёт в ответ. 4. Останавливаемся, как только набрано пять чисел.
На примере: у числа 1 186 005 наименьший делитель 3, наибольший собственный — 1 186 005 // 3 = 395 335, значит M = 395 338, и оно оканчивается на 8 — число подходит. У следующего числа 1 186 007 наименьший делитель 41, поэтому M = 28 968.
START = 1186000
LAST_DIGIT = 8
COUNT = 5
def smallest_divisor(n):
# наименьший делитель, больший единицы; самого n, если число простое
if n % 2 == 0:
return 2
d = 3
while d * d <= n:
if n % d == 0:
return d
d += 2
return n
# M — сумма наименьшего и наибольшего собственных делителей числа:
# если p — наименьший делитель, больший единицы, то M = p + n // p.
found = []
n = START + 1
while len(found) < COUNT:
p = smallest_divisor(n)
if p != n: # у простых чисел собственных делителей нет
m = p + n // p
if m % 10 == LAST_DIGIT:
found.append((n, m))
n += 1
for x, m in found:
print(x, m)
Ответ: 1186005 395338 1186007 28968 1186012 593008 1186015 237208 1186021 4678
Шаблоны кода на Python
Числа по маске
fnmatch понимает маску из условия: ? — ровно одна цифра, * — любая последовательность цифр. Перебор идёт сразу с шагом делителя.
from fnmatch import fnmatch
for n in range(2023, 10 ** 7, 2023): # кратные 2023
if fnmatch(str(n), '1?2*4'):
print(n, n // 2023)1027684 508 1128834 558 1229984 608
Делители числа
Делители ищутся до корня из числа: вместе с d берётся n // d. Так перебор миллионов чисел укладывается в секунды.
from math import isqrt
def divisors(n):
result = set()
for d in range(2, isqrt(n) + 1): # без 1 и самого числа
if n % d == 0:
result.add(d)
result.add(n // d)
return sorted(result)
found = 0
for n in range(700_000, 10 ** 7):
d = divisors(n)
if len(d) == 4: # ровно четыре нетривиальных делителя
print(n, max(d))
found += 1
if found == 3:
break700012 350006 700025 140005 700047 233349
Как выполнять задание
- Откройте среду программирования и создайте файл в рабочей папке экзамена: задание требует программы, а не счёта в уме.
- Выпишите из условия три вещи: с какого числа начинается перебор (ищутся числа, «бо́льшие» указанного), сколько чисел нужно найти и что идёт во второй столбец — множитель, частное или значение M.
- Продумайте перебор так, чтобы он уложился в минуты. Проверять делители каждого числа подряд — самый долгий путь; сужайте множество: для произведения двух простых перебирайте меньшие простые множители до корня и их кратные, для маски собирайте только подходящие числа, для суммы делителей идите по числам до пятого подходящего.
- Проверьте программу на примере из условия, если он там есть: у маски и у суммы делителей такие примеры приведены, и ответ на них известен.
- Сверьте форму ответа: строки таблицы идут по возрастанию чисел, в строке два числа в порядке из условия, лишние строки оставляйте пустыми.
Что нужно знать
- Делители. Делители идут парами: если d делит n, то и \nd делит n. Поэтому делители достаточно искать до \√n: при d ≤ \√n второй делитель пары не меньше \√n, и пара находится сразу. Проверка простоты — те же пробные деления до \√n.
- Собственные делители. Наименьший делитель числа n, больший единицы, всегда прост. Наибольший собственный делитель — это \np, где p — наименьший делитель, поэтому M = p + \np. У простого числа собственных делителей нет, и по условию M равно нулю.
- Произведение двух простых. Если n = p · q, где p ≤ q — простые, то p ≤ \√n: меньший множитель ищут среди простых до корня, а не среди делителей каждого числа.
- Маска числа. «?» — ровно одна произвольная цифра, «*» — любая последовательность цифр, в том числе пустая. Число по маске удобно собирать как строку, подставляя цифры вместо «?» и цепочку вместо «*», а потом переводить в int.
Все три типа задания 25 разобраны на этой странице, а формулировка задания есть в демоверсии КЕГЭ 2027 на сайте.
Как оценивается
Проверка автоматическая, по ключу: ответ должен быть записан в форме из условия и полностью совпасть с эталоном. Код и черновики не проверяют — значение имеет только ответ. За верный ответ — 1 балл, частичного балла нет.
Критерии всех заданий экзамена — на странице критериев ЕГЭ.
Разбор задания демоверсии 2027
В демоверсии 2027 года файла у задания нет: ответ — таблица, в первом столбце которой пять чисел, бо́льших 1 103 285 717, а во втором — их наименьшие простые множители. Ключ ФИПИ: 1 103 299 319 — 1693; 1 103 309 477 — 1693; 1 103 322 107 — 16 187; 1 103 323 021 — 1693; 1 103 328 547 — 3169.
Проверим первую строку руками. 1 103 299 319 = 1693 · 651 683: оба множителя простые, и «16» встречается в записи каждого ровно один раз — в 1693 это первые две цифры, в 651 683 середина записи. Меньший из них, 1693, и идёт во второй столбец. Вторая и четвёртая строки устроены так же, с тем же множителем 1693; в третьей строке 1 103 322 107 = 16 187 · 68 161, и наименьший множитель здесь другой.
Та же программа с границей 1 103 285 717 и образцом «16» находит ровно этот ключ. Совпадение с ключом демоверсии и есть та проверка, которую стоит делать до запуска программы на своём варианте.
Типичные ошибки
Перебор «в лоб» не укладывается в минуты
Пробные деления до квадратного корня для каждого из сотен тысяч девятизначных чисел — это долгие минуты работы, а иногда и часы. Множество перебора сужают: меньшие простые множители до корня и их кратные, числа, собранные по маске, либо числа по возрастанию с остановкой на пятом подходящем.
«Ровно один раз» проверяют как «содержит»
В записи множителя образец должен встречаться ровно один раз. Подходит str(p).count('16') == 1, а не '16' in str(p): проверка вхождения пропустит и числа, где «16» стоит дважды. Для демоверсии 2027 образец — «16», в других вариантах он другой.
Проверяют только меньший множитель
Для произведения двух простых мало убедиться, что меньший множитель прост и содержит образец: частное n // p тоже должно быть простым и тоже содержать образец ровно один раз. Без проверки частного в ответ попадут лишние числа.
Забыли, что «*» бывает пустой
Маска с «*» допускает и пустую последовательность цифр: маске 1?67?81*8 соответствуют и более короткие числа, где звёздочка не добавила ни одной цифры. Если перебирать только ненулевые цепочки, часть ответа потеряется.
Числа напечатаны не по возрастанию
В таблице ответа первая строка — наименьшее найденное число, и все строки идут по возрастанию. При переборе кратных или чисел по маске порядок обнаружения не совпадает с числовым, поэтому найденное перед выводом сортируют.
Вопросы и ответы
Как решать задание 25 ЕГЭ по информатике?
Написать программу-перебор: выписать из условия границы и признак, сузить множество кандидатов, проверить их и напечатать найденное по возрастанию. Все три типа — произведение двух простых, числа по маске и сумма собственных делителей — решаются такой программой на 10–20 строк.
Что такое маска числа?
Маска — это последовательность цифр, в которой могут стоять «?» (ровно одна произвольная цифра) и «*» (любая последовательность цифр произвольной длины, в том числе пустая). Маске 3?12*4 соответствуют, например, числа 30 124 и 3 012 004.
Как быстро проверить простоту числа и найти делители?
Пробными делениями до \√n: функция isqrt из модуля math даёт точный целый корень, а после двойки перебор идёт по нечётным. Делители удобно искать парами: найдя d, сразу получаете второй делитель пары n // d, поэтому дальше корня идти не нужно.
Почему программа работает долго и как ускорить перебор?
Долго работают решения, которые для каждого числа проверяют все делители до корня. Ускорение — в смене множества перебора: простые меньшие множители и их кратные, числа, собранные по маске, либо числа по возрастанию с остановкой на нужном количестве.
Что изменилось в задании 25 в 2027 году?
Ничего: тема задания та же, что в 2026, изменения коснулись только заданий 10, 13 и 23. Ответ, как и раньше, вводится в таблицу, за верное решение даётся 1 балл.
Другие задания раздела «Алгоритмы и программирование»
- Задание 5алгоритм над двоичной записью числа · до 1 балла
- Задание 6исполнитель Черепаха · до 1 балла
- Задание 12исполнитель Редактор и машина Тьюринга · до 1 балла
- Задание 13число программ исполнителя · до 1 балла
- Задание 16рекурсивные функции · до 1 балла
- Задание 17обработка последовательности из файла · до 1 балла
- Задание 24обработка строки из файла · до 1 балла
- Задание 26сортировка и жадный выбор · до 2 баллов
По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено: