Перейти к содержимому

Задание 25 ЕГЭ по информатике 2027: делители и маски чисел

Задание 25до 1 балладелители и маски чисел
Раздел
Алгоритмы и программирование
Максимальный балл
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).

Решение на Python
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.

Решение на Python
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.

Решение на Python
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 понимает маску из условия: ? — ровно одна цифра, * — любая последовательность цифр. Перебор идёт сразу с шагом делителя.

Python
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. Так перебор миллионов чисел укладывается в секунды.

Python
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:
            break
Вывод
700012 350006
700025 140005
700047 233349

Шаблоны кода ко всем заданиям

Как выполнять задание

  1. Откройте среду программирования и создайте файл в рабочей папке экзамена: задание требует программы, а не счёта в уме.
  2. Выпишите из условия три вещи: с какого числа начинается перебор (ищутся числа, «бо́льшие» указанного), сколько чисел нужно найти и что идёт во второй столбец — множитель, частное или значение M.
  3. Продумайте перебор так, чтобы он уложился в минуты. Проверять делители каждого числа подряд — самый долгий путь; сужайте множество: для произведения двух простых перебирайте меньшие простые множители до корня и их кратные, для маски собирайте только подходящие числа, для суммы делителей идите по числам до пятого подходящего.
  4. Проверьте программу на примере из условия, если он там есть: у маски и у суммы делителей такие примеры приведены, и ответ на них известен.
  5. Сверьте форму ответа: строки таблицы идут по возрастанию чисел, в строке два числа в порядке из условия, лишние строки оставляйте пустыми.

Что нужно знать

  • Делители. Делители идут парами: если 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 балл.

Другие задания раздела «Алгоритмы и программирование»

По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено:

Все задания ЕГЭ по информатике →