ЕГЭ
Информатика
5 марта 2026
21 минута чтения

Задание 25 ЕГЭ по информатике: программа для обработки целочисленной информации

Задание 25 ЕГЭ по информатике (КЕГЭ) — это программа на 10–20 строк, которая перебирает целые числа и ищет среди них те, что обладают заданным свойством. Это задание высокого уровня сложности, за него дают 1 первичный балл, на него отводится примерно 20 минут, и записывать ответ нужно не числом и не парой чисел, а целой таблицей — в первом столбце найденные числа в порядке, заданном условием (обычно по возрастанию, иногда по убыванию), во втором — то, что для них требовалось посчитать. Файла к заданию не прикладывают, но обязательно нужна среда программирования. В статье — рабочий метод перебора делителей до корня, готовый шаблон программы на Python, три разбора реальных заданий из открытого банка ФИПИ с проверенными расчётами и разбор типичных ошибок. Потренироваться можно на реальных заданиях 25 ЕГЭ по информатике онлайн — с мгновенной проверкой ответа.


Что проверяет задание 25 ЕГЭ по информатике

По спецификации ФИПИ задание 25 проверяет умение создавать собственные программы (10–20 строк) для обработки целочисленной информации. Раздел кодификатора — «Алгоритмы и программирование», элемент содержания 3.4, проверяемое требование 2.12. Данные ниже приведены по действующей спецификации ФИПИ 2026 года; проекты КИМ-2027 ФИПИ публикует в конце августа 2026, но структура работы не менялась с 2025 года.

Проверяемые умения (КЭС 3.4, требование 2.12):

  • написать с нуля короткую (10–20 строк) программу для обработки целых чисел — без готовых заготовок и без входного файла;
  • организовать перебор чисел в заданном диапазоне и с заданным направлением (по возрастанию или по убыванию);
  • проверять числовое свойство (делимость, количество делителей, соотношение между делителями и т. п.) эффективным алгоритмом, а не полным перебором до самого числа;
  • накопить нужное количество найденных чисел и вывести их вместе с соответствующими значениями в заданном порядке;
  • записать результат в форме, которую требует инструкция: таблицей из двух столбцов, а не набором чисел вперемешку.
ПараметрЗначение
Максимальный балл1 первичный. Частичного зачёта на задании 25 нет: ответ либо полностью совпадает с эталоном, либо 0 баллов
Уровень сложностиВысокий (В) — одно из пяти заданий этого уровня во всей работе
Раздел кодификатора3. Алгоритмы и программирование; КЭС 3.4; требование 2.12
Формат ответаТаблица из двух столбцов: в первом столбце — найденные числа в порядке, заданном условием (по возрастанию либо по убыванию), во втором — соответствующие им значения (в демоверсии — 5 строк, но количество строк зависит от условия конкретного задания)
Нужен ли файлНет. Программа считает всё сама, без входных данных
Нужна ли специализированная средаДа — доступны среды программирования C#, C++, Pascal, Java, Python
Рекомендуемое время20 минут (по обобщённому плану ФИПИ)
Связанные заданияЗадание 17 (тоже программа для чисел, но ответ — два числа), задание 24 (программа для символьной информации, тот же высокий уровень), задание 26 (тоже целочисленная обработка, но с частичным зачётом и входным файлом)

Частичного зачёта здесь нет. На КЕГЭ частичный зачёт предусмотрен только для заданий 26 и 27. Задание 25 оценивается по принципу «всё или ничего»: любая лишняя строка, перепутанный порядок или неверное хотя бы одно число в паре — и весь ответ считается неверным.

Тренируйтесь на реальных заданиях

Задания 25 ЕГЭ по информатике из открытого банка ФИПИ с мгновенной проверкой ответа. Пишем программу, запускаем, сверяем — бесплатно.

Решать задание 25

Как выглядит формулировка

Условие задания 25 обычно состоит из двух частей: сначала определяется числовая характеристика (иногда с примером её вычисления), затем даётся сама задача на перебор. Но встречаются и однокомпонентные формулировки, где нужное свойство описано прямо внутри задачи на перебор, без отдельного определения. Вот реальные формулировки из открытого банка ФИПИ:

  • «Пусть M — сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю. Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M.»
  • «Напишите программу, которая перебирает целые числа, большие 350000, в порядке возрастания и ищет среди них такие, для которых наибольший натуральный делитель, не равный самому числу, не является простым числом. Программа должна найти и вывести первые 6 таких чисел и соответствующие им значения упомянутых делителей.»
  • «Пусть М — разность максимального и минимального натуральных делителей целого числа, не считая единицы и самого числа. […] Напишите программу, которая перебирает целые числа, меньшие 800000, в порядке убывания и ищет среди них такие, для которых значение М кратно 17 (ноль числу 17 не кратен). Вывести первые пять найденных чисел и соответствующие им значения М.»

Обратите внимание на последний пример: перебор идёт по убыванию, а не по возрастанию — числа меньше заданной границы. Направление перебора и порядок вывода не фиксированы раз и навсегда, их каждый раз нужно прочитать в условии заново.

Как записывается ответ. Дословно инструкция ФИПИ для задания 25 звучит так: «В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им…» (конкретное значение — своё для каждого условия: результат деления, делитель, значение M и так далее). Формат вывода программы дублирует эту структуру: «для каждого из найденных чисел в отдельной строке сначала выводится само число, затем — соответствующее ему значение». Строки в бланке идут в том же порядке, в котором перебор находил числа — то есть по возрастанию, если перебор шёл по возрастанию, и по убыванию, если по убыванию. Часто в задании отдельно указано: «количество строк в таблице для ответа избыточно» — это значит, что бланк рисует больше строк, чем нужно заполнить, и лишние строки следует оставить пустыми, а не пытаться угадать по ним, сколько чисел искать.

Теория: всё, что нужно для задания 25

Типовая постановка задачи

За разными формулировками задания 25 стоит одна и та же конструкция:

  • задан диапазон чисел — «больше N», «меньше N», иногда с направлением перебора;
  • задано свойство, связанное с делителями числа: «имеет ровно 4 различных делителя», «делится на K и содержит цифру d», «сумма (разность) минимального и максимального собственного делителя оканчивается на …»;
  • для каждого найденного числа нужно вывести вторую величину — обычно тот самый делитель или значение, через которое сформулировано свойство;
  • найти нужно ровно столько чисел, сколько указано в тексте (обычно 5 или 6), а не «все, что найдутся».

Отсюда и жёсткое требование к длине программы: 10–20 строк. Это не олимпиадная задача с хитрым алгоритмом — это перебор плюс одна проверяющая функция, написанные аккуратно и без ошибок.

Перебор делителей до корня, а не до N

Самая частая причина, по которой программа для задания 25 не укладывается по времени, — проверка делителей циклом for i in range(2, n). У числа n не может быть двух делителей больше √n, кроме самого числа: если a · b = n и оба множителя больше корня, их произведение уже больше n. Значит, достаточно перебрать делители только до √n включительно, а вторую половину каждой пары получить делением.

Разница на практике не «в разы», а на порядки. Ниже — реальный замер на одном и том же числе n = 900 000 011:

Наивный перебор for i in range(2, n):        25.27 c
Перебор до sqrt(n), while i * i <= n:         0.0016 c

Наивный вариант медленнее примерно в 16 000 раз — и это для одного-единственного числа. Настоящему заданию 25 нужно проверить не одно число, а идти по диапазону, пока не найдётся 5–6 подходящих: если подходящие числа редки, программе придётся проверить сотни кандидатов рядом с границей вида 700 000 или 900 000 000. При наивной проверке это уже не 20 минут работы программы, а часы — притом что 20 минут отведено на решение всей задачи целиком, включая написание кода. Перебор до корня — не оптимизация «на будущее», а обязательное условие, чтобы программа вообще досчитала до ответа.

Парные делители и правильный подсчёт

Когда i — делитель числа n (то есть n % i == 0), вместе с ним сразу находится второй делитель — n // i. Перебирая i от 1 до √n, вы получаете обе половины каждой пары, ничего не пропуская.

Ловушка полного квадрата

Если n — точный квадрат (например, 36 = 6 · 6), то при i = 6 число n // i тоже равно 6 — это один и тот же делитель, а не два разных. Если просто добавлять оба значения в список, делитель 6 попадёт туда дважды, и количество делителей будет посчитано неверно. Решение — либо собирать делители в set (множество само уберёт повторение), либо проверять отдельно: добавлять n // i только если n // i != i.

def divisors(n):
    result = set()
    i = 1
    while i * i <= n:
        if n % i == 0:
            result.add(i)
            result.add(n // i)
        i += 1
    return result


def count_divisors(n):
    return len(divisors(n))

Для задания 25 обычно нужны не все делители, а собственные — то есть без 1 и без самого числа. Их получают, убрав 1 и n из множества: divisors(n) - {1, n}. Если после этого множество пустое — у числа нет собственных делителей (оно простое), и в условии почти всегда для этого случая отдельно оговорено особое значение (например, «M считается равным нулю»).

Шаблон программы: перебор + накопление + печать

Почти любое задание 25 укладывается в один и тот же каркас из трёх частей: функция проверки свойства, цикл перебора с накоплением найденных чисел и печать результата.

def value_for(n):
    d = divisors(n) - {1, n}
    if not d:
        return 0
    return min(d) + max(d)


NEEDED = 5
found = []
n = 700000
while len(found) < NEEDED:
    n += 1
    v = value_for(n)
    if v != 0 and v % 10 == 8:
        found.append((n, v))

for number, value in found:
    print(number, value)

Функция value_for отвечает только за вычисление величины по условию — её код меняется от варианта к варианту. Цикл вокруг неё почти всегда одинаковый: while len(found) < NEEDED гарантирует, что программа остановится ровно тогда, когда наберёт нужное количество строк, а не раньше и не позже.

Сколько строк печатать и в каком порядке

Количество нужных строк никогда не нужно угадывать — оно прямо названо в тексте: «выведите первые пять найденных чисел», «первые 6 таких чисел». Именно это число и становится константой NEEDED в программе. Бланк ответа при этом может содержать больше строк, чем нужно заполнить, — ФИПИ отдельно предупреждает об этом фразой «количество строк в таблице для ответа избыточно». Лишние строки в бланке оставляют пустыми.

Порядок вывода определяется направлением перебора, которое тоже задано текстом: «в порядке возрастания» — перебор идёт вверх от границы, «в порядке убывания» — вниз. В обоих случаях порядок строк в ответе повторяет порядок, в котором перебор нашёл числа: если вы искали по убыванию, первая найденная строка — самое большое подходящее число, а вовсе не самое маленькое.

Алгоритм решения задания 25

  1. Выпишите на черновик три вещи из условия: границу диапазона и знак сравнения («больше N» или «меньше N»), направление перебора (возрастание или убывание) и точное количество строк, которое нужно вывести.
  2. Разберите определение величины (M, F и т. п.) на примере из условия — почти всегда там дан числовой пример. Убедитесь, что ваша формула для этого примера даёт то же число.
  3. Напишите функцию проверки свойства через перебор делителей до √n (цикл while i * i <= n), с корректной обработкой полного квадрата и особого случая «делителей нет».
  4. Напишите цикл перебора в нужном направлении (n += 1 или n -= 1), который останавливается, когда список найденных чисел достиг нужной длины.
  5. Выведите результат ровно в нужном формате: одна строка на пару, сначала число, потом значение, без лишнего текста и заголовков.
  6. Прогоните программу мысленно (или на бумаге) на первых 2–3 небольших числах из диапазона — это быстрее, чем потом искать ошибку в готовом выводе.
  7. Перенесите результат в таблицу ответа: числа — в первый столбец, значения — во второй, ровно столько строк, сколько нашлось, остальные строки бланка оставьте пустыми.

Доведите шаблон до автоматизма

Прорешайте 10–15 заданий подряд — и написание программы перестанет требовать раздумий. Задания 25 из открытого банка ФИПИ с проверкой ответа — на Repet.ai.

Открыть тренажёр

Примеры с разбором

Пример 1. Сумма минимального и максимального собственного делителя

Условие (реальное задание из открытого банка ФИПИ):

Пусть M — сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю. Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M. Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем — значение М. Строки выводятся в порядке возрастания найденных чисел.

Решение:

Собственные делители — все делители числа, кроме 1 и самого числа. Их минимум и максимум находим через перебор до корня:

def divisors(n):
    result = set()
    i = 1
    while i * i <= n:
        if n % i == 0:
            result.add(i)
            result.add(n // i)
        i += 1
    return result


def M(n):
    d = divisors(n) - {1, n}
    if not d:
        return 0
    return min(d) + max(d)


found = []
n = 700000
while len(found) < 5:
    n += 1
    m = M(n)
    if m != 0 and m % 10 == 8:
        found.append((n, m))

for number, value in found:
    print(number, value)

Запуск программы даёт:

700005 233338
700007 100008
700012 350008
700015 140008
700031 24168

Ответ (таблица): 700005/233338, 700007/100008, 700012/350008, 700015/140008, 700031/24168. Это совпадает с эталоном ответа из банка ФИПИ.

Проверка здравым смыслом: 700005 делится на 3 и на 5, значит минимальный собственный делитель — 3. Максимальный собственный делитель — это 700005, делённое на минимальный простой множитель: 700005 / 3 = 233335. У числа 700005 полный список собственных делителей — {3, 5, 15, 23, 69, 115, 345, 2029, 6087, 10145, 30435, 46667, 140001, 233335}, минимум 3, максимум 233335, сумма 233338 — ровно то, что выводит программа.

Пример 2. Наибольший собственный делитель — составное число

Условие (реальное задание из открытого банка ФИПИ):

Напишите программу, которая перебирает целые числа, большие 350000, в порядке возрастания и ищет среди них такие, для которых наибольший натуральный делитель, не равный самому числу, не является простым числом. Программа должна найти и вывести первые 6 таких чисел и соответствующие им значения упомянутых делителей. Формат вывода: для каждого из 6 таких найденных чисел в отдельной строке сначала выводится само число, затем упомянутый делитель. Строки выводятся в порядке возрастания найденных чисел.

Например, для числа 105 наибольший натуральный делитель 35 не является простым, для числа 15 наибольший натуральный делитель 5 — простое число, а для числа 13 такого делителя не существует.

Решение:

Здесь нужно ровно 6 строк, а не 5 — число берётся из текста, а не «по умолчанию». Наибольший делитель, не равный самому числу, — это max(divisors(n) - {n}); если множество оказалось пустым (n = 1) или единственный оставшийся делитель — 1 (n простое), «такого делителя не существует» — по примеру из условия это тоже не засчитывается:

def divisors(n):
    result = set()
    i = 1
    while i * i <= n:
        if n % i == 0:
            result.add(i)
            result.add(n // i)
        i += 1
    return result


def is_prime(k):
    if k < 2:
        return False
    i = 2
    while i * i <= k:
        if k % i == 0:
            return False
        i += 1
    return True


def largest_proper_divisor(n):
    d = divisors(n) - {n}
    if not d or max(d) == 1:
        return None
    return max(d)


found = []
n = 350000
while len(found) < 6:
    n += 1
    d = largest_proper_divisor(n)
    if d is not None and not is_prime(d):
        found.append((n, d))

for number, value in found:
    print(number, value)

Запуск программы даёт:

350001 116667
350002 175001
350004 175002
350007 116669
350008 175004
350009 31819

Ответ (таблица): 350001/116667, 350002/175001, 350004/175002, 350007/116669, 350008/175004, 350009/31819. Совпадает с эталоном ответа из банка ФИПИ. Проверка примером из условия: для 105 функция возвращает делитель 35 (не простое — подходит), для 15 возвращает 5 (простое — не подходит), для 13 возвращает None (делителя нет) — ровно то, что описано в условии.

Пример 3. Перебор по убыванию — направление меняет всё

Условие (реальное задание из открытого банка ФИПИ):

Пусть М — разность максимального и минимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то считаем значение М равным 0. Напишите программу, которая перебирает целые числа, меньшие 800000, в порядке убывания и ищет среди них такие, для которых значение М кратно 17 (ноль числу 17 не кратен). Вывести первые пять найденных чисел и соответствующие им значения М. Формат вывода: для каждого из пяти найденных чисел в отдельной строке сначала выводится само число, затем значение М. Строки выводятся в порядке убывания найденных чисел. Например, для числа 20 М = 10 − 2 = 8.

Решение:

Ключевое отличие от первых двух примеров — перебор идёт вниз от границы (n -= 1), и порядок строк в ответе тоже по убыванию. Условие явно исключает нулевое значение из числа кратных 17 («ноль числу 17 не кратен»), хотя формально 0 % 17 == 0 в Python — это нужно проверить отдельным условием m != 0:

def divisors(n):
    result = set()
    i = 1
    while i * i <= n:
        if n % i == 0:
            result.add(i)
            result.add(n // i)
        i += 1
    return result


def M(n):
    d = divisors(n) - {1, n}
    if not d:
        return 0
    return max(d) - min(d)


found = []
n = 800000
while len(found) < 5:
    n -= 1
    m = M(n)
    if m != 0 and m % 17 == 0:
        found.append((n, m))

for number, value in found:
    print(number, value)

Запуск программы даёт:

799995 266662
799990 399993
799967 114274
799956 399976
799922 399959

Ответ (таблица): 799995/266662, 799990/399993, 799967/114274, 799956/399976, 799922/399959. Совпадает с эталоном ответа из банка ФИПИ, включая порядок строк: первым идёт наибольшее из найденных чисел (799995), а не наименьшее — потому что перебор шёл по убыванию. Если бы вы по привычке отсортировали результат по возрастанию, ответ считался бы неверным.

Типичные ошибки и ловушки

Перебор делителей до N вместо корня

Цикл for i in range(2, n) для одного числа порядка 10⁸–10⁹ выполняется секунды, а программе нужно проверить сотни кандидатов подряд. Итог — программа не досчитывает за отведённые 20 минут. Правильно: while i * i <= n.

Путаница «делители» и «собственные делители»

Условие почти всегда уточняет: «не считая единицы и самого числа». Если оставить 1 и n в множестве делителей, минимум всегда окажется равен 1, а максимум — самому числу, и вся величина M будет посчитана неверно с самого начала.

Не учтён полный квадрат при сборе пар делителей

Если n — точный квадрат, значение i и n // i в какой-то момент совпадают. При добавлении в список (а не в set) один и тот же делитель попадёт туда дважды — это ломает подсчёт количества делителей, хотя на минимум и максимум обычно не влияет.

Взяли количество строк из размера таблицы бланка

Бланк ответа может рисовать больше строк, чем нужно заполнить — ФИПИ прямо пишет «количество строк в таблице для ответа избыточно». Настоящее число строк нужно искать в тексте («первые пять», «первые 6»), а не считать клетки в бланке.

Вывели лишние строки или не туда доехали

Если цикл не останавливается ровно при нужном количестве найденных чисел (например, продолжает искать «на всякий случай» или, наоборот, обрывается по ограничению количества итераций, а не по факту находки), в ответе окажется не тот набор строк, что в эталоне, — и весь ответ считается неверным, частичного зачёта здесь нет.

Не сверили направление и порядок вывода

«Больше N, по возрастанию» и «меньше N, по убыванию» — оба варианта встречаются в открытом банке. Если решать по привычному шаблону «всегда по возрастанию», не читая условие до конца, направление перебора и порядок строк в ответе получатся перепутаны.

Перепутали местами столбцы таблицы

В первом столбце — само найденное число, во втором — вычисленное для него значение (делитель, M, F и т. п.). Если напечатать их в обратном порядке, программа сформирует правильные числа, но не в тех столбцах — и ответ не совпадёт с эталоном.

Не обработан случай «делителей нет»

Для простых чисел множество собственных делителей пусто. Вызов min() или max() на пустом множестве в Python вызывает ошибку и останавливает программу. Условие почти всегда прямо говорит, что делать в этом случае («значение M считается равным нулю») — эту проверку нельзя пропускать.

Как задание 25 связано с остальным экзаменом

В КЕГЭ по информатике 27 заданий с кратким ответом, максимальный первичный балл — 29, на всю работу отводится 235 минут. Заданий высокого уровня — пять: 21, 24, 25, 26, 27. Задание 25 занимает в этом наборе особое место:

  • оно входит в раздел «Алгоритмы и программирование» вместе с заданиями 16, 17, 23, 24 и 26 — это девять заданий и десять первичных баллов;
  • вместе с заданием 24 образует пару «программирование с нуля, без файла»: 24 — про символьную информацию, 25 — про целочисленную, оба высокого уровня и требуют среды программирования;
  • делит требование написания программы (10–20 строк) с заданием 17 — но 17 работает с входным файлом и повышенного уровня, а 25 — без файла и высокого уровня;
  • приём «перебор до корня» напрямую пригодится в задании 26 — там тоже целочисленная обработка, но с сортировкой, входным файлом и частичным зачётом в 1 балл.

План подготовки на 2 недели

Неделя 1 — ставим метод

День 1–2: напишите и запустите функцию поиска делителей через перебор до корня, проверьте её на маленьких числах (12, 36, 49, 97) вручную. День 3–4: добавьте вычисление собственных делителей (без 1 и n) и разберите случай простого числа. День 5–7: соберите полный шаблон — проверка свойства, цикл накопления, печать — и прогоните его на условиях из этой статьи, сверяя вывод с приведёнными ответами.

Неделя 2 — разнообразие условий и скорость

День 1–3: прорешайте задания с разными числовыми характеристиками — количество делителей, сумма и разность делителей, делимость с дополнительным условием на цифры. Каждый раз явно выписывайте границу, направление перебора и нужное количество строк, прежде чем писать код. День 4–5: потренируйтесь с направлением «по убыванию» отдельно — большинство ошибок в тренировках связано именно с ним. День 6–7: решайте на время — 20 минут на задание, включая написание, запуск и перенос ответа в таблицу, и проверяйте себя в тренажёре на заданиях из банка ФИПИ.

Проверьте себя на реальных заданиях

На Repet.ai собраны задания ЕГЭ по информатике из открытого банка ФИПИ. Пишите программу, запускайте и проверяйте ответ мгновенно — бесплатно.

Перейти к практике
Частые вопросы

Часто задаваемые вопросы

Умение создавать собственные программы (10–20 строк) для обработки целочисленной информации. Нужно написать программу, которая перебирает целые числа в заданном диапазоне и находит среди них те, что обладают заданным свойством, связанным с делителями. В кодификаторе это элемент содержания 3.4, проверяемое требование 2.12, раздел «Алгоритмы и программирование».

1 первичный балл по принципу «всё или ничего»: частичного зачёта на задании 25 нет, он предусмотрен только для заданий 26 и 27. Уровень сложности — высокий, таких заданий во всей работе пять (21, 24, 25, 26 и 27). По обобщённому плану ФИПИ на задание отводится примерно 20 минут.

Нет. Задание 25 — одно из немногих заданий, требующих среды программирования, но не файла: программа сама генерирует и проверяет числа в цикле, входных данных ей не нужно. Файл прикладывается только к заданиям 17, 24, 26 и 27, а также к нескольким заданиям базового и повышенного уровня.

У любого делителя числа n есть парный делитель n, делённый на него, и хотя бы один из них не превышает квадратного корня из n. Значит, перебора до корня достаточно, чтобы найти все делители. Обычный цикл до n для чисел порядка 10⁸–10⁹ выполняется на порядки дольше и не успевает проверить нужное количество кандидатов за отведённое время.

Точное количество всегда названо в тексте задания словами вроде «первые пять найденных чисел» или «первые 6 таких чисел». Ориентироваться на число строк, нарисованных в бланке ответа, нельзя: ФИПИ прямо предупреждает фразой «количество строк в таблице для ответа избыточно» — бланк может содержать больше строк, чем нужно заполнить.

Нет. Направление перебора задаётся условием: встречаются формулировки «больше N, в порядке возрастания» и «меньше N, в порядке убывания». Порядок строк в ответе повторяет порядок, в котором перебор нашёл числа, — если перебор шёл по убыванию, первой в таблице идёт самая большая из найденных величин.

Если число n — точный квадрат, при переборе делителей до корня значение i и n // i в какой-то момент совпадают — это один и тот же делитель, а не два разных. Чтобы не посчитать его дважды, делители удобно собирать в множество (set) — оно само уберёт повторение, — либо явно проверять, что n // i отличается от i, прежде чем добавлять его отдельно.

Это все делители числа, кроме 1 и самого числа. Условие обычно уточняет это словами «не считая единицы и самого числа». Если число простое, собственных делителей у него нет — для этого случая условие почти всегда отдельно оговаривает, какое значение считать (например, ноль).


Готовы взять балл высокого уровня?

Задание 25 не требует хитрого алгоритма — только аккуратный перебор до корня, правильный шаблон вывода и внимание к направлению перебора. Отработайте это на реальных заданиях из открытого банка ФИПИ с мгновенной проверкой ответа.