Top.Mail.Ru

Создание программы для обработки целочисленной информации

11 класс

Поделиться статьей:

Informatics

Задание № 25 ЕГЭ по информатике проверяет умение писать алгоритмы для обработки целых чисел и работать с перебором. В статье разберём три основных типа задач 2026 года:

  • поиск делителей числа с различными условиями (сумма, количество, свойства);
  • перебор чисел по маске с использованием модуля fnmatch;
  • проверка простых чисел и их свойств (например, разность между соседними простыми числами).

Термины, которые будем использовать: делитель, простое число, оптимизация, маска числа.

Задачи на делители числа

Делители числа удобно искать парами: если a — делитель n, то n//a — тоже делитель. Это позволяет перебирать значения только до $\sqrt{n}$.

Основной алгоритм поиска всех делителей:

def find_divisors(n):
    divs = []
    for i in range(1, int(n ** 0.5) + 1):
        if n % i == 0:
            divs.append(i)           # Добавляем i
            if i != n // i:           # Если i ≠ n//i, добавляем парный делитель
                divs.append(n // i)
    return sorted(divs)

Типовые условия из ЕГЭ

1. Найти минимальный делитель, больший 1 (он же наименьший простой делитель).

def min_divisor(n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return i
    return n  # Если делителей нет, число простое

2. Найти сумму минимального и максимального делителей (не считая 1 и n).

def M(n):
    divisors = []
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    if not divisors:
        return 0
    return min(divisors) + max(divisors)

Пример из демоверсии

Найти числа, большие 800 000, у которых сумма минимального и максимального делителей (не считая 1 и n) оканчивается на 4.

def M(n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return i + n // i
    return 0

count = 0
n = 800000
while count < 5:
    n += 1
    val = M(n)
    if val != 0 and val % 10 == 4:
        count += 1
        print(n, val)

Задачи на маски

Второй тип задач — работа с числовыми масками. В них используются специальные символы:

  • ? — заменяет ровно одну любую цифру;
  • * — обозначает любую последовательность цифр, включая пустую.

Модуль fnmatch

Python предоставляет встроенный модуль fnmatch для работы с такими масками:

from fnmatch import fnmatch

# Проверка, соответствует ли строка маске
if fnmatch(str(number), "3?12?14*5"):
    # Число подходит под маску

Основной алгоритм решения задач с масками

from fnmatch import fnmatch

# Важно: перебираем числа, кратные делителю (это ускоряет перебор в 2026 раз!)
for num in range(2026, 10**10 + 1, 2026):
    if fnmatch(str(num), "5?34?71*2"):
        print(num, num // 2026)

Пример из демоверсии

Найти числа до 10¹⁰, соответствующие маске 3?12?14*5 и делящиеся на 1917.

python
from fnmatch import fnmatch

for num in range(0, 10**10 + 1, 1917):
    if fnmatch(str(num), "3?12?14*5"):
        print(num, num // 1917)
Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

Задачи на простые числа

Третий тип задач сочетает работу с делителями и проверку чисел на простоту. Рассмотрим алгоритм проверки числа на простоту:

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

Практикум

Задание 1

Назовём нетривиальным делителем натурального числа его делитель, не равный единице и самому числу. Например, у числа 6 есть два нетривиальных делителя: 2 и 3. Найдите первые 5 чисел, большие 3 243 000, которые разбиваются на 2 простых множителя, не обязательно различных, которые содержат в себе ровно один 0. В ответе запишите число и сумму делителей.

def pr(n):
  for i in range(2, int(n**0.5) + 1):
      if n % i == 0:
          return False
  return True

mas = []
for i in range(3_243_000, 5_000_000):
  count = 0
  delit = []
  for j in range(2, int(i**0.5) + 1):
      if i % j == 0:
          if pr(j) == True and pr(i//j) == True:
              if str(j).count('0') == 1 and str(i//j).count('0') == 1:
                  count += 2
                  delit = [j, i//j]
  if count >= 2:
        mas.append([i, delit[1] + delit[0]])
        print(i, delit[1] + delit[0], len(delit))
  if len(mas) == 5:
      print(mas)
      break

Ответ:

3243491 30420
3243601 3602
3243689 8490
3244069 10874
3244133 30426

Задание 2

Назовём нетривиальным делителем натурального числа его делитель, не равный единице и самому числу. Например, у числа 6 есть два нетривиальных делителя: 2 и 3. Найдите первые 5 чисел, большие 3 243 000, которые разбиваются на 2 простых множителя, не обязательно различных, которые содержат в себе ровно одну цифру 7. В ответе запишите число и сумму делителей.

def pr(n):
  for i in range(2, int(n**0.5) + 1):
      if n % i == 0:
          return False
  return True

mas = []
for i in range(3_243_000, 5_000_000):
  count = 0
  delit = []
  for j in range(2, int(i**0.5) + 1):
      if i % j == 0:
          if pr(j) == True and pr(i//j) == True:
              if str(j).count('7') == 1 and str(i//j).count('7') == 1:
                  count += 2
                  delit = [j, i//j]
  if count >= 2:
        mas.append([i, delit[1] + delit[0]])
        print(i, delit[1] + delit[0], len(delit))
  if len(mas) == 5:
      print(mas)
      break

Ответ:

3243013 87686
3243073 190786
3243079 463304
3243179 9204
3243199 25664

Задание 3

Назовём нетривиальным делителем натурального числа его делитель, не равный единице и самому числу. Например, у числа 6 есть два нетривиальных делителя: 2 и 3. Найдите первые 5 чисел, большие 1 468 000, которые разбиваются на 2 простых множителя, не обязательно различных, которые содержат в себе ровно одну цифру 4. В ответе запишите число и сумму делителей.

def pr(n):
  for i in range(2, int(n**0.5) + 1):
      if n % i == 0:
          return False
  return True

mas = []
for i in range(1_468_000, 5_000_000):
  count = 0
  delit = []
  for j in range(2, int(i**0.5) + 1):
      if i % j == 0:
          if pr(j) == True and pr(i//j) == True:
              if str(j).count('4') == 1 and str(i//j).count('4') == 1:
                  count += 2
                  delit = [j, i//j]
  if count >= 2:
        mas.append([i, delit[1] + delit[0]])
        print(i, delit[1] + delit[0], len(delit))
  if len(mas) == 5:
      print(mas)
      break

Ответ:

1468157 4578
1468417 3838
1468609 31294
1468703 31296
1468751 34200

Заключение

После разбора задания № 25 становится понятно, как подходить к разным типам задач и не теряться в переборе.

Теперь ты умеешь:

  • находить делители с учётом оптимизации до $\sqrt{n}$;
  • работать с масками и ускорять перебор за счёт кратности;
  • проверять числа на простоту и использовать это в составных условиях.

Эти приёмы позволяют уверенно решать типовые задания на делители, маски и простые числа. Дальше важно закрепить их на практике и научиться быстро выбирать подходящий алгоритм под конкретное условие.

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок

Список всех тем