25 задание ЕГЭ по информатике: делители, маски и код
Чтобы решить 25 задание ЕГЭ по информатике, переведи условия о делителях или цифрах числа в проверки и напиши программу перебора. Здесь разберём поиск делителей, маски с символами * и ?, применение fnmatch и способы проверить код до записи ответа.
25 задание ЕГЭ по информатике: разбор условия
В задании № 25 нужно самостоятельно составить программу для работы с числами и делимостью. В условии могут потребоваться количество подходящих чисел, сами числа, их делители или значения выражения. Поэтому начни с вопроса: что именно должна вывести программа?
Раздели условие на три части: область поиска, признаки подходящего числа и формат результата. Например, принадлежность отрезку определяет границы цикла, требование к делителям становится отдельной функцией, а слово «количество» означает, что нужен счётчик.
Не начинай с большого цикла наугад. Сначала запиши проверки обычными словами, затем соедини их логическим and. Если подходит любой из нескольких вариантов, потребуется or. Это помогает заметить ситуацию, когда программа проверяет лишь часть условия.
- Выпиши нижнюю и верхнюю границы, отметь, включены ли они.
- Уточни, какие делители учитываются: все натуральные, простые, собственные или отвечающие дополнительному условию.
- Отдельно запиши требования к порядку чисел и столбцов ответа.
- Проверь, нужно найти все подходящие числа или только несколько первых.
Делители и множители: как искать без лишнего перебора
Если натуральное число n делится на d без остатка, то n // d тоже является его делителем. Поэтому достаточно проверять d от 1 до целого квадратного корня из n включительно. Каждая успешная проверка даёт пару делителей.
У полного квадрата два элемента одной пары совпадают. Например, при n = 36 проверка d = 6 должна добавить шестёрку один раз. Иначе программа завысит количество различных делителей. Функция ниже учитывает это и возвращает отсортированный список:
from math import isqrt def divisors(n): result = [] for d in range(1, isqrt(n) + 1): if n % d == 0: result.append(d) if d != n // d: result.append(n // d) return sorted(result)
Функция рассчитана на натуральные n. Для единицы она вернёт список из одного элемента. isqrt вычисляет целую часть квадратного корня без перехода к дробным числам.
Ровно четыре различных натуральных делителя имеют числа вида p³ или p × q, где p и q — различные простые числа. Это полезный математический контроль. Не путай делители с простыми множителями: у числа 12 различные простые множители — 2 и 3, а натуральных делителей больше.
- Если единица и само число учитываются, оставляй их в списке.
- Если нужны только простые делители, добавь проверку простоты.
- Если исключается само число, отфильтруй его явно, не меняя остальные требования.
Пример задания из банка «Ранга»
Этот пример поможет проверить поиск парных делителей и подсчёт чисел на включённом отрезке. Обрати внимание: считаются различные натуральные делители, включая единицу и само число.
Условие. Рассматриваются натуральные числа из отрезка [129231; 130188].
Определи количество чисел этого отрезка, у которых ровно 4 различных натуральных делителей (включая единицу и само число). В ответе запиши только целое число.
Показать ответ и решение
- Количество делителей числа считают перебором до квадратного корня: каждый найденный делитель даёт пару. Второй путь — разложение на простые множители: число делителей равно произведению увеличенных на единицу показателей степеней.
- Ограничь перебор делителей квадратным корнем из числа — иначе программа не успеет отработать.
Ответ: 202
Код для задания № 25: подсчёт чисел на отрезке
После проверки функции делителей основной перебор получается коротким. Следующая функция использует divisors из предыдущего раздела и считает числа с четырьмя различными натуральными делителями на включённом отрезке:
def count_four(left, right): return sum( len(divisors(n)) == 4 for n in range(left, right + 1) )
Передай в left и right границы из условия. Выражение len(divisors(n)) == 4 возвращает True или False; sum учитывает их как 1 и 0. Здесь нельзя заменить проверку равенства на >=: числа с большим количеством делителей тогда тоже попадут в результат.
Для записи ответа выведи результат вызова функции через print. Отладочную печать списков делителей используй отдельно: она помогает понять ошибку, но может затруднить чтение итогового результата.
Оцени объём работы до запуска. Для каждого числа проверяются кандидаты до квадратного корня. На умеренном отрезке такой подход удобен; для значительно большего диапазона может понадобиться использовать свойства простых множителей или другую организацию поиска.
- Проверь маленький отрезок вручную и сравни количество.
- Отдельно проверь простое число, полный квадрат и число с четырьмя делителями.
- Посмотри, не пропущена ли правая граница из-за отсутствующего + 1.
Маски и шаблоны чисел: что означают * и ?
Маска задаёт допустимую десятичную запись числа. Обычно цифры в ней должны совпадать буквально, знак ? обозначает ровно одну произвольную цифру, а * — любую последовательность цифр, включая пустую. Точные определения обязательно прочитай в условии.
Шаблону 12?3 соответствует запись 1203, но не 123: для вопросительного знака нужна отдельная цифра. Маске 12*3 подходят и 123, и 1203, и 12003. Ошибка с пустой последовательностью у звёздочки часто приводит к пропуску коротких чисел.
Маска проверяет запись, а делимость — значение числа. Поэтому сначала определи кандидатов, затем проверь оба требования. Совпадение с шаблоном само по себе не означает, что число подходит для ответа.
Помни о ведущих нулях: str(n) возвращает обычную запись натурального числа. Не добавляй нули слева, если условие этого не требует. При ручном построении кандидатов также следи, чтобы первая цифра не была нулём.
- Проверь короткую запись, где * заменяет пустую строку.
- Проверь запись, где * заменяет несколько цифр.
- Для ? проверь вариант с недостающей цифрой: он должен быть отклонён.
Маски fnmatch: код для задания № 25
В Python проверять такие маски удобно средствами модуля fnmatch. Функция fnmatchcase сопоставляет строку с шаблоном целиком. Для строк из цифр она подходит так же, как fnmatch, и явно выполняет сопоставление с учётом регистра, который здесь роли не играет.
Если число должно делиться на положительное k, перебирай сразу кратные k. Функция ниже принимает включённую верхнюю границу limit и возвращает пары: подходящее число и частное от его деления на k.
from fnmatch import fnmatchcase def find_mask(limit, k, mask): result = [] for n in range(k, limit + 1, k): if fnmatchcase(str(n), mask): result.append((n, n // k)) return result
Подставь параметры из условия. Числа будут расположены по возрастанию, потому что range перебирает их именно так. Частное добавлено как пример второго столбца: оставляй его только тогда, когда оно требуется в ответе.
Шаг k сокращает перебор, но не делает любой диапазон удобным для вычисления. Если кандидатов слишком много, используй фиксированные цифры маски: перебирай переменные позиции и проверяй делимость построенных чисел. При нескольких способах построения удаляй повторы и сортируй результат.
- Передавай в fnmatchcase строку str(n), а не целое число.
- Не заменяй * символом ?: они задают разное количество цифр.
- При строгом ограничении n < limit исключи саму верхнюю границу.
Как проверить решение и организовать тренировку
Проверяй отдельно математическое условие и оформление результата. Верный список чисел ещё не означает верный ответ: можно перепутать столбцы, вывести лишние значения или записать список вместо количества.
Для проверки алгоритма делителей сравни его с прямым перебором всех d от 1 до n на небольших числах. Приведённая функция divisors проверена таким способом для чисел от 1 до 500 в Python 3. Поиск по маске также проверен сравнением с полным перебором на небольшом диапазоне.
Эти проверки подтверждают работу показанных функций, но после изменения условий код нужно проверить заново. Особенно внимательно проверяй дополнительные ограничения: нечётность делителей, исключение единицы, минимальное значение числа или требуемое количество найденных строк.
Тренируйся по одному типу условий: сначала делители, затем маски, затем их сочетания. В «Ранге» можно пройти бесплатный тест и использовать тренажёр с проверкой ответа. После ошибки запиши её причину и повтори похожую задачу самостоятельно.
- Сверь каждый критерий условия с конкретной проверкой в коде.
- Проверь граничные значения и особые случаи.
- Для нескольких найденных чисел независимо проверь делимость и маску.
- Перед переносом ответа убери отладочные строки и сверь порядок вывода.
Частые вопросы
Задание № 25 ЕГЭ по информатике: сколько баллов?
Максимальный первичный балл смотри в спецификации текущего года на сайте ФИПИ: открой раздел ЕГЭ, выбери информатику и найди таблицу распределения заданий. Уточни также правила оценивания ответа. Не путай оценку отдельного задания со шкалой перевода общего результата.
Где посмотреть требования к заданию № 25 текущего года?
На сайте ФИПИ открой комплект документов по информатике: демоверсию, спецификацию и кодификатор. По демоверсии проверь форму ответа, по спецификации — характеристики задания, по кодификатору — проверяемые умения. Организационные сведения об экзамене сверяй с публикациями Рособрнадзора.
Обязательно ли использовать fnmatch для масок?
Нет, можно самостоятельно построить подходящие записи или проверить их программно. fnmatch удобен, когда кандидаты уже определены и нужна короткая проверка шаблона. При большом диапазоне сначала сократи количество кандидатов.
Почему программа неверно считает делители квадратов?
Обычно квадратный корень добавляется дважды: как d и как n // d. Перед добавлением второго элемента пары проверяй, различаются ли они. При этом сам корень должен входить в диапазон перебора.
Что делать, если программа работает слишком долго?
Оцени число итераций внешнего и внутреннего циклов. Для делителей используй перебор до квадратного корня, а при известной кратности — шаг, равный делителю. Если этого недостаточно, строй кандидатов по фиксированным цифрам маски и проверяй только их.
Полезно по теме
Читать дальше
Проверить себя в тренажёре
Открывается тренировочное задание в формате ЕГЭ: условие видно сразу, краткий ответ проверяется без регистрации.
Решить задание в тренажёреМатериал — разъяснение «Ранг». Официальные правила экзамена, расписание, шкалы баллов и перечни заданий публикуют ФИПИ (fipi.ru) и Рособрнадзор (obrnadzor.gov.ru). Мы не обещаем конкретных баллов: результат зависит от твоей работы.