Проверить программы онлайн · файлы остаются в браузере

Перебор: делители и простые числа — практикум

10 класс, углублённый уровень. Занятие шестое: цикл по переменной и чем он отличается от цикла с условием, делители и простые числа, перебор отрезка — форма задания 25 ЕГЭ.

План на пару. Сначала тренажёр: шесть коротких задач, ответ — что напечатает Python. Потом три своих программы: делители числа, разложение на простые множители и перебор отрезка, как в задании 25 ЕГЭ. Проверяет их оболочка Проверка.bat из общей папки: она запускает программу на семи наборах данных. Интернет не нужен.

Часть 1. Тренажёр: что напечатает Python

Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: запустив программу, вы узнаете ответ, но не научитесь. Ответ — ровно то, что появится на экране; если программа печатает несколько строк, перечисли их через пробел. Последний тип — задание 25 ЕГЭ в уме: там кода нет вовсе, числа перебираем в голове, отрезок для этого подобран короткий.

0 верно из 6

Часть 2. Как перебирают

Цикл по переменной: range

фрагмент программы — набери его сам

range(a, b) даёт числа от a до b − 1. Чтобы дойти до самого n, пишут range(1, n + 1) — это самая частая правка в задачах про делители. После цикла переменная хранит последнее пройденное значение.

for или while — одно и то же?

фрагмент программы — набери его сам

Любой for переписывается через while, и наоборот. Разница в удобстве: for берут, когда число шагов известно заранее («перебрать делители от 1 до n»), while — когда его определяет сама задача («пока делится», «пока не нашли»). Два отличия, из которых растут ошибки:

Делители: перебор от 1 до n

фрагмент программы — набери его сам

Тот же цикл со s = s + d даёт сумму делителей, с print(d) — их список, с m = d — наибольший (максимум накоплением: последний найденный и есть наибольший). Делители ходят парами: если d делит n, то и n // d делит. Один из пары не больше корня из n — отсюда все быстрые проверки.

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

Простое — то, у которого ровно два делителя: 1 и само число. Поэтому 1 — не простое (у него один делитель), а 2 — простое, и единственное чётное.

фрагмент программы — набери его сам

Почему до корня: если у n есть делитель больше корня, парный ему меньше корня — и нашёлся бы раньше. Для миллиона это тысяча проверок вместо миллиона.

Разложение на множители

фрагмент программы — набери его сам

Здесь шаг делает не счётчик, а само число: 60 → 30 → 15 → 5 → 1. Пока n делится на d, снимаем d снова и снова: 64 даст шесть двоек. Составным d не окажется никогда: все его простые множители к тому моменту уже сняты.

Перебор отрезка: задание 25 ЕГЭ

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

фрагмент программы — набери его сам
Две частые ошибки темы. range(a, b) без + 1 — правый конец отрезка не проверяется, и ошибка вылезает только тогда, когда он сам подходит под условие. И if вместо while при разложении: множитель снимается один раз, а он мог войти дважды.

Часть 3. Три программы

Задание 1 Делители

Программа читает натуральное число код (от 1 до 100000) и печатает три строки: все его делители по возрастанию через пробел, их количество и простое ли это число. Напомним: у простого ровно два делителя.

Вход

28

Вывод

Делители: 1 2 4 7 14 28
Количество: 6
Простое: нет

Проверяется: код по код с правой границей, счётчик и накопитель-строка, ветвление после цикла.

Если застрял

Перебор код, внутри проверка код. Делители копи в строке, как траекторию в прошлый раз: перед циклом код, на каждом найденном код, после цикла код. Количество — обычный счётчик.

Ловушка, ради которой это задание. Простое ли число, честнее всего решать по количеству делителей: ровно два — простое. Тогда единица сама собой окажется не простой (у неё один делитель), а 2 — простой. Оболочка подаст 1, 2, 4 и большие простые. И проверь, что код доходит до самого код: без код само число в делители не попадёт.

Задание 2 Множители

Программа читает натуральное число код (от 2 до 1000000) и печатает его разложение на простые множители: сами множители по неубыванию через пробел, их количество и наибольший из них. Для простого числа множитель один — оно само.

Вход

360

Вывод

Множители: 2 2 2 3 3 5
Количество: 6
Наибольший: 5

Проверяется: цикл с условием, в котором шаг делает само число; «пока делится» вместо «если делится»; хвост после цикла.

Если застрял

Самый простой способ — из разбора выше: код, код, делится — запомнили код и поделили, не делится — код. Для миллиона он успевает. Наибольший множитель — последний снятый, его не надо искать отдельно: просто перезаписывай переменную при каждом снятии.

Ловушки, ради которых это задание. Оболочка подаст 64 — там двойка входит шесть раз, и код вместо код снимет её один раз. И подаст 194 = 2 · 97: если ты перебираешь код только до корня из код, после цикла останется 97 — это тоже множитель, и его надо напечатать (код).

Задание 3 Ровно k делителей

Задача в форме задания 25 ЕГЭ. Программа читает три числа, каждое со своей строки: границы отрезка код и код (1 ≤ a ≤ b ≤ 5000, в отрезке не больше 200 чисел) и код (от 2 до 12). Для каждого числа отрезка, у которого ровно код делителей, печатает строку из двух чисел: само число и его наибольший делитель, не равный ему. Последней строкой — «Найдено:» и сколько таких чисел; эта строка печатается всегда, даже если не найдено ничего.

Вход

95
100
6

Вывод

98 49
99 33
Найдено: 2

Проверяется: вложенные циклы, счётчик внутри и снаружи, код, максимум накоплением.

Если застрял

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

Ловушки, ради которых это задание. Оболочка подаст отрезок код с код: оба конца подходят, и код без код потеряет 99. Подаст код — отрезок из одного числа. И подаст отрезок, где не подходит ничего: тогда единственная строка вывода — код.

Часть 4. Сдача

  1. Файлы zadanie1.py … zadanie3.py лежат в твоей папке, отладочные print из них убраны.
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

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

Подсказка: перебор, делители и простые числа

Цикл по переменной

range(a, b) — числа от a до b − 1: правая граница не входит, до самого n доходит range(1, n + 1). range(n) начинается с нуля и даёт n чисел. Третье число — шаг: range(1, 10, 3) даёт 1, 4, 7; range(10, 0, −2) идёт вниз: 10, 8, 6, 4, 2. range(5, 1) без шага пуст. После for переменная хранит последнее пройденное значение; менять её внутри тела бесполезно.

for или while

Любой цикл переписывается другим. for — когда число шагов известно заранее (перебрать d от 1 до n), while — когда его определяет задача (пока делится, пока не нашли). После while в переменной первое неподошедшее значение, после for — последнее пройденное. В while шаг делает сам программист — иначе вечный цикл.

Цифры числа

n % 10 — последняя цифра, n // 10 отрезает её; while n > 0 перебирает все. Накопитель стартует с нуля для суммы, с единицы для произведения, с 9 для минимума цифры; флаг «есть ли цифра» стартует с «нет».

Делители

for d in range(1, n + 1): if n % d == 0 — перебор всех делителей; счётчик даёт их количество, накопитель — сумму, m = d — наибольший. Делители ходят парами d и n // d, один из пары не больше корня из n; у точного квадрата одна пара схлопывается, поэтому делителей нечётное число: у 49 их три.

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

Ровно два делителя: 1 и само число. 1 — не простое, 2 — единственное чётное простое. Проверка: флаг prime = n > 1 ставится один раз до цикла, в цикле только сбивается; перебирать d достаточно, пока d · d ≤ n. Наименьший делитель больше единицы всегда простой.

Разложение на множители

d = 2; while n > 1: делится — снять d и поделить (d не двигать: он мог войти ещё раз), не делится — d = d + 1. 60 = 2 · 2 · 3 · 5. Если перебирать d только до корня, остаток n > 1 после цикла — тоже множитель (194 = 2 · 97). Ровно три делителя бывает у квадрата простого, четыре — у p · q или p³.

Задание 25 ЕГЭ

Перебрать числа отрезка по порядку, для каждого проверить свойство (число делителей, вид разложения), напечатать подходящие и что просят рядом — обычно делитель. Два вложенных цикла: внешний по отрезку, range(a, b + 1); внутренний по делителям, счётчик обнуляется перед ним. Строку с итогом печатать всегда, даже когда найдено ноль.

Материалы подготовлены с использованием технологий искусственного интеллекта.