Как оптимизировать эту программу, ибо она не выводит ничего при таком большом промежутке, python

Найдите все натуральные числа, принадлежащие отрезку [35 000 000; 40 000 000], у которых ровно пять различных нечётных делителей (количество чётных делителей может быть любым). В ответе перечислите найденные числа в порядке возрастания. Вот такое вот задание должно решаться таким вот кодиком:


from math import sqrt

for i in range(35000000, 40000001):
    dels_count = 0
    for j in range(1, round(sqrt(i)) + 1):
        if i % j == 0:
            if j % 2 != 0:
                dels_count += 1
            par_del = i / j
            if par_del % 2 != 0:
                dels_count += 1
    if dels_count == 5:
        print(i)

но ничего не вылезает, хотя с промежутками поменьше всё пашет


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Число 81 имеет ровно пять нечётных делителей. Я добавил в ваш код отладочную печать:

from math import sqrt

for i in range(81, 82):
    dels_count = 0
    for j in range(1, round(sqrt(i)) + 1):
        if i % j == 0:
            if j % 2 != 0:
                dels_count += 1
                print('found', i, j)
            par_del = i / j
            if par_del % 2 != 0:
                dels_count += 1
                print('found', i, par_del)
    if dels_count == 5:
        print(i)
$ python five_odd_divisors.py 
found 81 1
found 81 81.0
found 81 3
found 81 27.0
found 81 9
found 81 9.0

Главная проблема: делитель 9 учтён два раза. Меньшая проблема: деление целых в Питоне производит вещественный результат.

Поправьте эти проблемы и ваш код заработает. Время работы будет около часа. Наберитесь терпения.

→ Ссылка