Проект Эйлера: Задача 5. Наименьшее кратное

Имеется следующая задача

Написал вот такой код:

from random import randint as random

own = []

while len(own) != 1:
    num = random(1, 100000)
    temp = []

    # Генерация 20-ти чисел которые будут делиться на случайное число.
    for i in range(1, 21):
        while i != 20:
            temp.append(int(num) / i)

            # Проверка на наличие дробного числа в списке.
            for o in temp:
                if type(o) == float:
                    temp.clear()
                else:
                    continue
                if len(temp) == 20:
                    own.append(num)
                else:
                    pass

Результата никакого он не выдаёт, просто работает и всё. Большая просьба - объяснить, что не так с кодом, и как мне можно написать его для правильной работы. Может Вы знаете алгоритмические способы, подходящие для такой задачи - я с удовольствием изучу их и использую. Но, пожалуйста, не нужно писать сам код который решает проблему, т.к. я начинающий в этой области - хочу сам попрактиковаться в написании кода. Спасибо! :)


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

Автор решения: shalor1k

Возможно проблема вашего кода в том , что в нём отсутствует return или же print поэтому никакого вывода в консоль не происходит. Я знаю , что вы просили не скидывать вам полный код , но всё же рекомендую ознакомиться с данной ссылкой в ней разобран весь алгоритм простым и понятными языком. Если вы его как следует изучите в будущем вам будет проще.

→ Ссылка
Автор решения: Алексей Власов

В for i in range(1,21): есть цикл while i != 20, он выполняется бесконечно, начнёт выполнятся при i = 1, а в самом цикле i не изменяется.

Задачу можно решить с помощью разложения на множители.

→ Ссылка
Автор решения: becouse
  1. Разложим каждое число по степеням простых чисел.

  2. Результат это наименьшее общее кратное - т.е. берем каждое простое число в наибольшей степени

    primes = [2, 3, 5, 7, 11, 13, 17, 19]
    res = {2: 0, 3: 0, 5: 0, 7: 0, 11: 0, 13: 0, 17: 0, 19: 0}
    
    
    def get_powers(n, primes):
        pr = {}
        for p in primes:
            if n % p == 0:
                pr[p] = 0
            while (n % p == 0):
                pr[p] += 1
                n = n / p
        return pr
    
    
    def merge_powers(pr, res):
        for p in pr:
            res[p] = max(pr[p], res[p])
        return res
    
    
    n = 20
    
    for i in range(2, n + 1):
        pr = get_powers(i, primes)
        res = merge_powers(pr, res)
    
    result = 1
    
    for p in res:
       if res[p]>0:
            result = result * (p**res[p])
    
    
    print(result)
    
→ Ссылка
Автор решения: Victor VosMottor
def lcm(a, b):
    m = a * b
    while a != 0 and b != 0:
        if a > b:
            a %= b
        else:
            b %= a
    return m // (a + b)


while 1:
    try:
        x = int(input('a = '))
        y = int(input('b = '))
        print('НОК:', lcm(x, y))
    except ValueError:
        break

source

→ Ссылка