9 мин чтения

ЕГЭ по информатике 2026 · задание 25 из 27

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

Задание 25 — высокий уровень, 1 балл. Нужна программа примерно на 10–20 строк для перебора целых чисел: маска, делители, простые множители. В бланк вводят то, что программа напечатала, обычно пары чисел, по строке на каждое найденное. Код не сдают. Частичного балла нет: набор строк должен совпасть с эталоном, включая порядок.

Отдельного файла к линии 25, как правило, нет. Ограничения написаны в условии.

Конспект

Маска. Символ * заменяет любую последовательность цифр, в том числе пустую, если не сказано иное. ? обычно ровно одна цифра. Число не может иметь ведущий ноль, если оно не само ноль. Значит, маска *05 не начинает перебор с пустой звёздочки, если получается 05 как запись с нулём впереди — уточните, считают ли такие числа. Чаще ведущие нули в найденном числе запрещены, а сама маска уже задаёт начало.

Перебирайте подставляемую часть циклом range, собирайте число и проверяйте делимость. Не генерируйте все числа от 1 до 10^12.

Делители. Чтобы найти все делители n, перебирайте d от 1 до sqrt(n). Если n % d == 0, делители — d и n // d. Не забывайте, что при полном квадрате корень учитывают один раз.

Ровно три делителя. Такое натуральное число — квадрат простого: делители 1, p и p². Ровно два делителя — само простое.

Поиск простых множителей. Делите n на 2, затем на нечётные до корня. Если после цикла остаток больше 1, это последний простой множитель. ФИПИ просит проверить именно выделение множителей: типичная ошибка — посчитать делитель дважды или остановиться на первом.

Чётность, окончание на цифры, «нечётный делитель больше 1000» — фильтры после поиска делителей, не вместо него.

Шаблон на Python

Маска 123*567, звёздочка — любое число цифр, число делится на 123, в ответе число и целый частный. Ограничьте длину звёздочки так, чтобы покрыть диапазон из условия, и уберите ведущие нули, если они запрещены.

def odd_divisors(n):
    divs = []
    d = 1
    while d * d <= n:
        if n % d == 0:
            if d % 2:
                divs.append(d)
            other = n // d
            if other != d and other % 2:
                divs.append(other)
        d += 1
    return sorted(divs)

def mask_numbers(max_digits=4):
    for length in range(0, max_digits + 1):
        limit = 10 ** length if length else 1
        for x in range(limit):
            mid = str(x).zfill(length) if length else ""
            s = "123" + mid + "567"
            if s[0] == "0":
                continue
            yield int(s)

for n in mask_numbers():
    if n % 123 == 0:
        print(n, n // 123)

Для «найти все числа от L до R с ровно пятью делителями» маска не нужна: пять делителей бывают у четвёртой степени простого. Перебирайте простые и возводите в четвёртую.

Проверьте на маленьком примере. Для 36 делители 1, 2, 3, 4, 6, 9, 12, 18, 36. Если скрипт их не собирает, до файла или маски его не пускайте. Здесь файла нет, но ошибка в sqrt так же портит ответ.

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

  • Звёздочка не включает пустую подстановку, хотя по условию может.
  • Корень-делитель продублирован.
  • В ответ попал составной множитель вместо наибольшего простого.
  • Числа напечатаны не в том порядке, в котором просит условие.

Попробуйте объяснить с Мишкой

Бесплатный ИИ-репетитор объяснит любую тему так, как вам понятно — шаг за шагом.

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