Python

Python. Вложенные циклы. Решение без использования функций(def;len; и тд)

Даны два натуральных числа a и b. Найдите все числа, принадлежащие отрезку [a; b], являющиеся произведением трех различных простых делителей. Выведите количество таких чисел, их среднее арифметическое, а также минимальное и максимальное их них.
Входные данные
Программа получает на вход натуральные числа a и b, не превышающие 107, a ≤ b.
Выходные данные
Вывести в одной строке через пробел 3 числа, являющиеся ответом к задаче. Если чисел, удовлетворяющих условию задачи, на отрезке нет, то программа не должна ничего выводить.
"Выведите количество таких чисел, их среднее арифметическое, а также минимальное и максимальное их них" - итого 4 числа. Но далее написано: "Вывести в одной строке через пробел 3 числа, являющиеся ответом к задаче". WTF?

Вот такая реализация:
 MAX = 107
PRIMES = [2, 3, 5, 7] # простые числа, квадрат которых не более половины ограничителя (107/2)

a, b = [int(x) for x in input("Введите границы отрезка a, b через пробел: ").split()]
if a > b or b > MAX:
print("Нижняя граница должны быть меньше верхней, и обе не должны превышать 107")
quit()

comp3count = 0
comp3sum = 0
comp3min = MAX + 1
comp3max = 0

for n in range(a, b + 1):
part = n # то, для чего ищем делители
dcount = 0 # количество делителей (всегда не менее 1, т.к. один делитель - само число)
for p in PRIMES:
if p * p > part: break # дальше делить нет смысла
while part % p == 0: # найден делитель, делим, пока делится
part /= p
dcount += 1
if part > 1: dcount += 1 # если что-то осталось, то оно - тоже множитель

if dcount == 3:
comp3count += 1
comp3sum += n
if comp3min > n: comp3min = n
if comp3max < n: comp3max = n

if comp3count > 0:
print(comp3count, comp3sum / comp3count, comp3min, comp3max)
Некоторые пояснения:
  1. Чтобы найти простой множитель N, необходимо перебирать множители только до √N (думаю, понятно, почему).
  2. Общее же ограничение сверху на простые числа - это √(MAX / 2) (т.к. если у нас 3 делителя, то один из них - не менее 2, а далее нужно перебирать потенциальные множители MAX/2).
  3. comp3min, comp3max необязательно сравнивать на каждой итерации; т.к. мы перебираем числа по возрастанию, то comp3min будет первым найденным числом, а comp3max - последним. Но это усложнит алгоритм.
Сергей Зоммер
Сергей Зоммер
54 053
Лучший ответ