Найдите все числа от 1000 до 2000, у которых ровно три различных делителя
Условие
Требуется написать программу, которая находит все натуральные числа на отрезке от 1000 до 2000 включительно, имеющие ровно три различных натуральных делителя (единица и само число тоже считаются делителями). Определите, какие это числа, обоснуйте, почему их структура именно такая, и объясните, во сколько примерно раз ускорится проверка одного числа, если перебирать делители не до n, а до квадратного корня из n.
Ответ
1369, 1681 и 1849 — это , и ; перебор делителей до вместо ускоряет проверку одного такого числа примерно в 45 раз
Решение по шагам
Шаг 1. Почему у «обычного» числа делителей чётное количество
Делители любого натурального естественно разбиваются на пары: если — делитель, то и — тоже делитель, и они «смотрят» друг на друга. Например, для : пары , , — всего 6 делителей.
Пара «схлопывается» в один элемент только тогда, когда , то есть .
Отсюда ключевой вывод: количество делителей нечётно тогда и только тогда, когда — полный квадрат. Нам нужно ровно 3 делителя, число нечётное, значит искать надо только среди полных квадратов.
Шаг 2. Какие полные квадраты дают ровно три делителя
Пусть . Тогда среди делителей заведомо есть , и — уже три штуки (и они попарно различны при ).
Чтобы других делителей не появилось, у самого не должно быть собственных делителей, кроме 1 и : любой делитель числа , отличный от 1 и , добавил бы к списку делителей и сам , и число .
Значит, обязано быть простым, и искомые числа — это в точности квадраты простых чисел:
Остаётся понять, какие простые дают квадрат внутри отрезка.
Осталось ещё 3 шага — откроются после входа:
- Шаг 3. Находим границы для основания квадрата
- Шаг 4. Отбираем простые и выписываем ответ
- Шаг 5. Оценка ускорения перебора
Бесплатно · займёт минуту
Частые ошибки
- ✗
Включают в ответ квадраты составных чисел: 1296 (), 1600 (), 1764 (), 1936 () — у них делителей заметно больше трёх.
- ✗
Ищут простые числа из отрезка (1009, 1013 и т. д.): у простого числа ровно два делителя, а не три.
- ✗
Забывают, что 1 и само число тоже считаются делителями, и ищут числа с тремя «собственными» делителями.
- ✗
Берут границы «на глаз» как от 31 до 45 и добавляют лишние 961 или 2025, выходящие за отрезок.
- ✗
В программе пишут
for d in range(1, int(n**0.5))без включения самого корня и теряют делитель у полных квадратов — как раз у тех чисел, которые и нужны. - ✗
При подсчёте делителей через пары дважды считают и в случае и получают 4 делителя вместо 3.