如何有效地获得一系列数字的GCD和LCM?

时间:2012-01-10 16:15:14

标签: math greatest-common-divisor 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 个答案:

答案 0 :(得分:1)

from fractions import gcd
def lcm(a, b):
    return (a * b) // gcd(a, b)

答案 1 :(得分:0)

您可以使用递归技术:

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

将所有GCD值存储在哈希映射中。因此,当它执行递归步骤时,它首先访问哈希映射以查看是否已经计算了较小数字的GCD,如果您为大范围的输入执行此操作,这将节省大量时间。

答案 2 :(得分:0)

如Chris J this所述,问题提供了算法。这是一个使用reduce内置函数和自{2.6版以来一直存在的fractions模块的答案的python版本。

import fractions

def gcd(*values):
    return reduce(fractions.gcd, values)