найти наименьший общий кратный числам 1-20

У меня проблемы с этим алгоритмом. Я пытаюсь найти наименьший общий кратный для заданного диапазона чисел. Следующие функции находят коэффициенты числа, подсчитывают разные факторы числа, подсчитывают факторы, чтобы я мог найти lcm диапазона чисел на основе этого алгоритма, а затем, наконец, вычисляет lcm; однако, если вы запустите этот код, оператор печати внизу не напечатает правильный ответ. Вместо этого я получаю номер, который, я знаю, не прав. Мне нужен второй набор глаз, чтобы указать на проблему с этим кодом. Может ли кто-нибудь помочь?

from collections import defaultdict def factors_of(number): factors = []; i = 2 while number >= 2: if number % i == 0: factors.append(i) number = number / i else: i += 1 return factors def count_factors(number): count = {} factors = factors_of(number) for factor in factors: if not factor in count: count[factor] = 1 else: count[factor] += 1 return count def count_factors_of_numbers_in_range(start, stop): count = defaultdict(int) for number in range(start, stop): factor_count = count_factors(number) for key in factor_count: if count[key] < factor_count[key]: count[key] = factor_count[key] return dict(count) def find_lcm_of_numbers_in_range(start, stop): count = count_factors_of_numbers_in_range(start, stop) lcm = 1 for key in count: total = count[key] * key lcm = total * lcm return lcm print find_lcm_of_numbers_in_range(1, 21) 

почему вы не можете просто найти gcd по алгоритму Евклида и умножить числа и делить на gcd, чтобы найти LCM?

 def decorator(d): """This is a decorator that will decorate all decorators. This will add update_wrapper to all decorators. (fun) -> fun """ def _d(f): return update_wrapper(d(f), f) return update_wrapper(_d, d) @decorator def nary(f): """This is docp implementation of n_ary function above. (function) -> function Tue-23-April-2013 """ def n_ary(x, *args): if len(args) == 0: return x return f(x, n_ary(*args)) return n_ary @nary def gcd(a, b): """Calculate the Greatest Common Divisor of a and b. Unless b==0, the result will have the same sign as b (so that when b is divided by it, the result comes out positive). """ while b: a, b = b, a%b return a 

Я понял, что я сделал не так. Наверное, мне просто нужен был хороший ночной сон.

Проблема заключалась не в причуде с Python (как я думал, это может быть), но в моей собственной реализации алгоритма. В моем коде

 def find_lcm_of_numbers_in_range(start, stop): count = count_factors_of_numbers_in_range(start, stop) lcm = 1 for key in count: total = count[key] * key lcm = total * lcm return lcm 

Я перепутал все числа вместе в total . Вместо того, чтобы умножить число 2 на число 4, мне нужно было умножить 2 сам по себе 4 раза ( 2 ** 4 ). Просто изменив код, чтобы он выглядел

 def find_lcm_of_numbers_in_range(start, stop): count = count_factors_of_numbers_in_range(start, stop) lcm = 1 for key in count: total = key ** count[key] lcm = total * lcm return lcm 

все сработало, и теперь я счастлив. 🙂