Задание 18. ИНФОРМАТИКА
Примерное время выполнения - 20 минут
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку 1400 200; 400 220], числа, имеющие ровно четыре различных натуральных делителя. Для каждого найденного числа выведите эти четыре делителя в строку через пробел. Они должны следовать
в порядке возрастания.
Например, в диапазоне [9; 11] ровно четыре различных натуральных делителя имеет число 10, поэтому для такого диапазона вывод на экране должен содержать следующие значения: 1 25 10
Задача понятна. Ниже дам подробное решение для учащихся 11 класса информатики и приведу рабочий пример кода на Python. В примере поясню идею и дам корректный вывод для диапазона [9; 11].
Что требуется
- Найти в заданном целочисленном диапазоне [L; R] все числа, у которых ровно четыре различных натуральных делителя.
- Для каждого такого числа вывести эти четыре делителя в порядке возрастания, через пробел.
- Пример: для диапазона [9; 11] число 10 имеет делители 1, 2, 5, 10, поэтому вывод будет: "1 2 5 10".
Ключевая идея
Числа, имеющие ровно четыре делителя, бывают двух типов:
- n = p^3, где p — простое. Дваждыкратно умножая: делители — 1, p, p^2, p^3.
- n = p · q, где p и q — различные простые. Делители — 1, p, q, p·q.
Эти два случая покрывают все возможные числа с ровно четырьмя делителями.
План решения
- Пройти по всем целым числам n в диапазоне [L, R].
- Найти все делители n. Самый простой способ: пройти d от 1 до sqrt(n). Если n делится на d, то d и n/d — оба делителя.
- Собрать все делители, отсортировать их и проверить, что их ровно четыре.
- Если да — вывести их в порядке возрастания.
Алгоритм (псевдокод)
- Для n в [L, R]:
- divisors = пустой список
- для d от 1 до floor(sqrt(n)):
- если n mod d == 0:
- добавить d в divisоры
- если d != n/d: добавить n/d
- если длина divisors == 4:
- отсортировать divisors и вывести их как строку "d1 d2 d3 d4"
Пример вывода
- Для диапазона [9; 11]:
- n = 9: делителей 1, 3, 9 (3 делителя) — пропускаем
- n = 10: делители 1, 2, 5, 10 — выводим: 1 2 5 10
- n = 11: делителей 1, 11 (2 делителя) — пропускаем
- Итоговый вывод: одна строка "1 2 5 10"
Пример кода на Python
- Вход: два целых числа L и R (можно подать через стандартный ввод).
- Вывод: для каждого числа с ровно четырьмя делителями выведите четыре делителя в одной строке.
Программа (Python 3)
def find_numbers_with_four_divisors(L, R):
for n in range(L, R + 1):
divisors = []
limit = int(n**0.5)
for d in range(1, limit + 1):
if n % d == 0:
divisors.append(d)
other = n // d
if other != d:
divisors.append(other)
if len(divisors) == 4:
divisors.sort()
print(' '.join(map(str, divisors)))
if __name__ == "__main__":
import sys
data = sys.stdin.read().strip().split()
if len(data) >= 2:
L, R = map(int, data[:2])
else:
# Пример по умолчанию, если вход не указан
L, R = 9, 11
find_numbers_with_four_divisors(L, R)
Как это работает
- Для каждого n мы находим все делители за счет пары (d, n/d) при d, делящем n.
- Если таких делителей ровно четыре, мы сортируем их и выводим.
- В простейшем случае это работает за время примерно O((R-L+1) * sqrt(n)), что достаточно для школьной задачи с умеренными диапазонами.
Замечания по заданному тексту задачи
- В примере вывода для диапазона [9; 11] правильный набор делителей для числа 10: "1 2 5 10" (в тексте примера допущена ошибка — там было написано "1 25 10").
- Если вам дан совсем другой диапазон, просто передайте его в программу как два числа L и R. Программа распознает и выведет подходящие строки для каждого подходящего n.
Дополнительное примечание
- Если хотите оптимизировать под большие диапазоны, можно вместо перебора всех делителей для каждого n применить факторизацию по малым простым и использовать формулу количества делителей. Но для задачи 11 класса и диапазона, как правило, достаточно простого метода через sqrt(n).