Как эффективно получить GCD и LCM диапазона чисел?
В настоящее время я использую этот код, чтобы найти gcd и lcm
def gcd(a, b):
while b != 0:
a, b = b, a%b
return a
def lcm(a, b):
result = a*b/gcd(a,b)
return result
Но что если я захочу сделать это для списка номеров, например [4,5,7,1,5,7,10,1,16,24] и т. Д.? Я ограничен петлями?
3 ответа
Решение
Как упомянул Крис Дж, этот вопрос предоставляет алгоритм. Вот Python-версия ответа, который использует reduce
встроенный и fractions
модуль, который существует с версии 2.6.
import fractions
def gcd(*values):
return reduce(fractions.gcd, values)
from fractions import gcd
def lcm(a, b):
return (a * b) // gcd(a, b)
Вы можете использовать рекурсивную технику:
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a%b)
Сохраните все свои значения GCD в хэш-карте. Таким образом, когда он выполняет рекурсивный шаг, он сначала обращается к хэш-карте, чтобы увидеть, вычислен ли GCD меньших чисел, что сэкономит много времени, если вы выполняете это для большого диапазона входных данных.