Задача понятна. Ниже дам подробное решение для учащихся 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
- если n mod d == 0:
- если длина 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).