Как эффективно получить GCD и LCM диапазона чисел? - PullRequest
1 голос
/ 10 января 2012

В настоящее время я использую этот код для поиска 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 ]

1 голос
/ 24 июля 2015
from fractions import gcd
def lcm(a, b):
    return (a * b) // gcd(a, b)
0 голосов
/ 11 января 2012

Как упомянул Крис J этот ТАК вопрос предоставляет алгоритм. Ниже приведена версия ответа на языке Python, в которой используется встроенный модуль reduce и модуль fractions, существовавший с версии 2.6.

import fractions

def gcd(*values):
    return reduce(fractions.gcd, values)
0 голосов
/ 10 января 2012

Вы можете использовать рекурсивную технику:

def gcd(a, b):
   if b == 0:
      return a
   else:
      return gcd(b, a%b)

Сохраните все свои значения GCD в хэш-карте.Таким образом, когда он выполняет рекурсивный шаг, он сначала обращается к хэш-карте, чтобы увидеть, был ли вычислен GCD меньших чисел, что сэкономит много времени, если вы выполняете это для большого диапазона входных данных.

...