5 мин чтения

Как решать задание 25 ЕГЭ по информатике — обработка целочисленной информации

Разбор задания 25 ЕГЭ по информатике: поиск чисел с заданным свойством в диапазоне, простые числа, делители, наибольший простой делитель. Шаблоны на Python и оптимизации.

О чём задание 25

Задание 25 — работа с целыми числами. Типовая формулировка: «найди все натуральные числа из диапазона [A, B], у которых есть такое-то свойство, и выведи их по правилу из условия». Или: «выведи первые N чисел, упорядоченных по определённому критерию».

Задание стоит 1 первичный балл. В КЕГЭ 2026 это последнее одноочковое задание — дальше идут только двухочковые 26 и 27, которые проверяют программирование и анализ данных. Стабильно сдавать 25-е — обязательное условие для 70+ тестовых баллов. Подготовку с нуля мы разбирали в отдельной статье.

Типовые свойства

СвойствоКак проверять
Простое числоПеребор делителей до sqrt(n)
Наибольший простой делительПоследовательное деление на простые
Сумма делителей равна SПеребор делителей с парой n/d
Количество делителей равно kПодсчёт в цикле до sqrt(n)
Сумма цифр равна Ssum(int(d) for d in str(n))
Палиндромstr(n) == str(n)[::-1]
Цифровой корень равен rПовторная сумма цифр до одной цифры
Кратность / делимостьn % k == 0

Смешанные условия — тоже частые: «найди числа, у которых НПД равен 5 и сумма цифр чётная». Решение — два флага в теле цикла.

Базовые шаблоны

Простое число

def is_prime(n):
    if n < 2:
        return False
    if n < 4:
        return True          # 2 и 3
    if n % 2 == 0:
        return False
    d = 3
    while d * d <= n:
        if n % d == 0:
            return False
        d += 2               # только нечётные делители
    return True

Две оптимизации:

  1. Сразу отсекаем 2, потом идём по нечётным — вдвое меньше итераций.
  2. Условие d * d <= n, а не d <= sqrt(n) — без вызова sqrt, чуть быстрее.

Наибольший простой делитель

def largest_prime_factor(n):
    d = 2
    while d * d <= n:
        if n % d == 0:
            n //= d
        else:
            d += 1
    return n

Алгоритм: делим n на 2 столько раз, сколько можем, потом на 3, на 5 и так далее. В переменной n в конце остаётся либо 1, либо самый большой простой делитель. Единственное тонкое место — если исходное n простое, функция вернёт исходное число.

Сумма делителей

def sum_divisors(n):
    total = 0
    d = 1
    while d * d <= n:
        if n % d == 0:
            total += d
            if d != n // d:     # не добавлять sqrt(n) дважды для полного квадрата
                total += n // d
        d += 1
    return total

Классика: делители ходят парами. Если n = 36, d = 6, то n/d = 6тот же делитель, его не нужно добавлять дважды. Проверка d != n // d это ловит.

Сумма цифр и палиндром

def sum_digits(n):
    return sum(int(ch) for ch in str(n))

def is_palindrome(n):
    s = str(n)
    return s == s[::-1]

Строковые операции в ЕГЭ разрешены и работают быстро. Писать руками через % 10 и // 10 не обязательно — кода больше, смысла меньше.

Полный пример: числа со свойством

Условие: «найди все натуральные числа x из диапазона [A, B], для которых наибольший простой делитель меньше самого числа (то есть x — составное). Выведи их в порядке возрастания по одному в строке, рядом — значение наибольшего простого делителя».

def largest_prime_factor(n):
    d = 2
    while d * d <= n:
        if n % d == 0:
            n //= d
        else:
            d += 1
    return n

A = 174457
B = 174505

for x in range(A, B + 1):
    lpf = largest_prime_factor(x)
    if lpf < x:
        print(x, lpf)

Простые числа исключаются автоматически — у простого x функция вернёт само x, и условие lpf < x не выполнится.

Оптимизация: не вызывать функцию дважды

В коде выше largest_prime_factor(x) вызывается один раз — результат сохранён в lpf. Плохой вариант выглядит так:

if largest_prime_factor(x) < x:
    print(x, largest_prime_factor(x))   # повторный вызов — вдвое медленнее

На больших диапазонах второй вызов может удвоить время выполнения. Всегда сохраняй результат в переменную, если используешь его дважды.

Разобранная задача 1: простые числа в диапазоне

Найди все простые числа в диапазоне [100 000; 100 500] и выведи их сумму.

Решение

def is_prime(n):
    if n < 2:
        return False
    if n % 2 == 0:
        return n == 2
    d = 3
    while d * d <= n:
        if n % d == 0:
            return False
        d += 2
    return True

A, B = 100000, 100500
total = sum(x for x in range(A, B + 1) if is_prime(x))
print(total)

Тайминг

500 проверок, каждая до sqrt(100000) ≈ 316 итераций — около 150 000 операций. Работает меньше секунды даже в онлайн-интерпретаторе.

Альтернатива — решето

Для огромных диапазонов (миллионы чисел) используется решето Эратосфена. Но на ЕГЭ это избыточно: диапазоны обычно до 10^6 чисел, и прямая проверка простоты проходит за секунды.

Типичная ошибка

if n % 2 == 0:
    return False      # ловушка: для n = 2 вернёт False, хотя 2 — простое

В коде выше пропущен случай n == 2. Исправленный вариант — return n == 2. Всегда проверяй функцию на маленьких значениях: 0, 1, 2, 3.

Разобранная задача 2: числа с наибольшим простым делителем в диапазоне

Найди все натуральные числа x в диапазоне [1 000 000; 1 100 000], у которых наибольший простой делитель меньше 100. Выведи их количество и сумму.

Разбор

Задача сложнее: диапазон — 100 000 чисел, для каждого нужна факторизация. Простая реализация с факторизацией O(sqrt(n)) на число даёт 100000 × 1000 = 10^8 операций — на грани 5-секундного лимита Python.

Оптимизация 1: ранний выход

def has_large_prime_factor_ge(n, limit):
    """True, если у n есть простой делитель >= limit."""
    d = 2
    while d * d <= n:
        if n % d == 0:
            if d >= limit:
                return True
            n //= d
        else:
            d += 1
    return n >= limit      # остаток — либо 1, либо простое число

Как только нашли делитель >= limit — сразу True, не тратим время.

Оптимизация 2: пропуск чётных после двойки

def largest_prime_factor(n):
    result = 1
    while n % 2 == 0:
        result = 2
        n //= 2
    d = 3
    while d * d <= n:
        if n % d == 0:
            result = d
            n //= d
        else:
            d += 2
    if n > 1:
        result = n
    return result

После отсечения двоек делители могут быть только нечётными — шаг d += 2.

Полное решение

def largest_prime_factor(n):
    result = 1
    while n % 2 == 0:
        result = 2
        n //= 2
    d = 3
    while d * d <= n:
        if n % d == 0:
            result = d
            n //= d
        else:
            d += 2
    if n > 1:
        result = n
    return result

A, B = 1_000_000, 1_100_000
count = 0
total = 0
for x in range(A, B + 1):
    if largest_prime_factor(x) < 100:
        count += 1
        total += x

print(count, total)

Тайминг

После оптимизаций — около 2-3 секунд на обычном ноутбуке. Приемлемо для ЕГЭ.

Типичная ошибка: TLE

Наивная реализация «перебирай делители от 2 до n» даёт сложность O(n) на число. На миллионе чисел это 10^12 операций — не пройдёт никогда. Всегда используй d * d <= n, а не d <= n.

Одним циклом vs предвычисления

Для многих задач помогает предвычислить таблицу. Например, если нужна сумма цифр каждого числа из большого диапазона — считать её на лету быстрее, чем заранее. А вот если нужен наибольший простой делитель всех чисел до N — решето с минимальным простым делителем даёт O(N log log N):

N = 1_000_000
min_prime = list(range(N + 1))   # min_prime[i] — наименьший простой делитель i
for i in range(2, N + 1):
    if min_prime[i] == i:        # i — простое
        for j in range(i * i, N + 1, i):
            if min_prime[j] == j:
                min_prime[j] = i

def largest_prime_factor_fast(n):
    lpf = 1
    while n > 1:
        lpf = min_prime[n] if min_prime[n] == n else 1  # упрощено для иллюстрации
        p = min_prime[n]
        while n % p == 0:
            n //= p
        lpf = p if n == 1 else lpf
    return lpf

На ЕГЭ это редко нужно, но полезно знать: если решение в лоб не укладывается в 5 секунд — иди в сторону предвычислений.

Тайминг и стратегия

В КЕГЭ на 27 заданий даётся 235 минут. Рекомендуемое распределение для 25-го задания:

  • 2-3 минуты — прочитать условие, выписать свойство и формат вывода.
  • 5 минут — вспомнить нужный шаблон (простое, делители, сумма цифр и т.д.).
  • 5-8 минут — написать код, проверить на мелком примере.
  • 1-2 минуты — запустить на полном диапазоне, скопировать ответ.
  • 1 минута — перепроверить формат вывода.

Итого — 15-20 минут. Если не получилось за 25 — пропускай и возвращайся в конце. Терять 40 минут на 1 балл — плохая стратегия, когда впереди двухочковые 26 и 27.

Типичные ошибки

ОшибкаК чему ведётКак исправить
Перебор делителей до n, а не до sqrt(n)TLE на больших диапазонахУсловие d * d <= n в цикле
Пропуск n == 2 в проверке простоты2 не попадает в простыеОтдельно обработать n < 4
Повторный вызов функции в printУдвоение времениСохрани результат в переменную
Неверный порядок выводаНоль за заданиеПеречитать условие 2 раза
Забытая сортировкаОтвет в случайном порядкеВсегда проверяй sorted() перед выводом
Добавление sqrt(n) дважды в сумме делителейНеверный ответ для полного квадратаПроверка d != n // d
Путаница делителей и простых делителейСвойство проверяется не тоВ функции НПД после цикла проверь остаток n

Особенно коварная ошибка

Граница диапазона. Условие «числа из диапазона [A; B]» означает включительно оба конца. В Python: range(A, B + 1). Забудешь +1 — потеряешь последнее число в ответе. Проверяй на мелком примере: range(5, 10) даёт [5, 6, 7, 8, 9], а не [5, 6, 7, 8, 9, 10].

Как тренироваться

  1. Выучи 5 шаблонов наизусть: простое число, НПД, сумма делителей, сумма цифр, палиндром. Каждый пиши с нуля без подглядывания.
  2. Решай по типам: 3-5 задач на каждое свойство подряд, чтобы закрепить.
  3. Проверяй на малых значениях: запускай функцию на n=0, 1, 2, 3, 10, 100 — и сверяй ответ руками.
  4. Тренируй тайминг: засекай время. Цель — 15 минут на задачу средней сложности.

Полезные материалы:

Выводы

  • Задание 25 — последнее одноочковое, обязательно сдаваемое при подготовке к 70+ тестовым.
  • Главная оптимизация — перебор делителей до sqrt(n). Без неё большие диапазоны не пройдут по времени.
  • Алгоритм наибольшего простого делителя — деление на простые с шагом по возрастанию. 10 строк кода, которые решают половину задач.
  • Не вызывай функцию дважды, всегда сохраняй результат. Сортируй вывод, если нужно.
  • Если после 20 минут не решил — пропусти. 25-е — всего 1 балл из 29, а впереди 26 и 27.

На экзамене задание 25 — это проверка того, что ты знаешь стандартные шаблоны и умеешь их быстро адаптировать. Выучи 5 шаблонов, и 95% условий будут решаться за 15 минут.

Частые вопросы

Сколько баллов стоит задание 25 ЕГЭ по информатике

Задание 25 стоит 1 первичный балл. В КЕГЭ 2026 всего 27 заданий и 29 первичных баллов: задания 1-25 дают по 1 баллу, а 26 и 27 — по 2. 25-е — последнее одноочковое, дальше идут только сложные двухочковые. Шкалу перевода первичных в тестовые смотри в статье Баллы ЕГЭ по информатике для вузов.

Какой диапазон чисел в задании 25

Диапазоны сильно варьируются. Типичный пример — [174 457; 174 505] (до сотни чисел, решается простым перебором). Но бывают диапазоны в миллионы и десятки миллионов — там уже обязательны оптимизации: перебор до sqrt(n) вместо n, решето Эратосфена или предвычисление таблицы делителей.

Почему перебор делителей только до sqrt(n)

Если число n делится на d, то оно делится и на n/d. То есть делители ходят парами: один меньше sqrt(n), второй больше. Поэтому достаточно проверять до sqrt(n) включительно — остальных делителей можно получить делением. Это снижает сложность с O(n) до O(sqrt(n)) — в разы быстрее на больших числах.

Как быстро проверить простоту числа

Перебирай делители от 2 до sqrt(n). Если на любом из них делится — составное. Иначе — простое. Для чисел до 10^9 такая проверка занимает микросекунды. Для миллиардов чисел в огромных диапазонах используй решето Эратосфена.

Что такое наибольший простой делитель

Наибольший простой делитель числа n — самый большой простой делитель, на который n делится нацело. Например, для n = 60 = 2² × 3 × 5 наибольший простой делитель — 5. Для простого числа наибольший простой делитель равен самому числу. Типичная формулировка 25-го задания: найти x в диапазоне, у которых НПД равен, например, 5.

Нужно ли сортировать ответ в задании 25

Обычно — да. В условии чаще всего: «выведи числа в порядке возрастания» или «в порядке убывания». Иногда просят первые N по какому-то критерию (например, по убыванию суммы цифр). Внимательно читай финальную формулировку — неверный порядок вывода = ноль за задание.

Сколько времени выделять на задание 25

Ориентир — 15-20 минут. Это последнее одноочковое задание, дальше идут двухочковые 26 и 27, на которые суммарно нужно 50-80 минут. В КЕГЭ 235 минут на 27 заданий. Если за 20 минут не получилось — пропускай и возвращайся в конце.

Какие свойства чисел чаще всего спрашивают

Топ-5 по частоте: простота числа, наибольший простой делитель, количество делителей, сумма делителей, сумма цифр / цифровой корень. Реже — палиндромы, числа с конкретным количеством двоек в двоичной записи, числа с ровно k простыми делителями. На каждое свойство есть стандартный шаблон — учи их.

Готов применять на практике?

В тренажёре TuteMe — 2000+ заданий ЕГЭ по информатике с автоматической проверкой и подробным разбором. AI-помощник подсказывает, где ты ошибаешься, и подбирает задания под твой уровень.

Начать бесплатно →