【问题标题】:How to get GCD and LCM of a range of numbers efficiently?如何有效地获得一系列数字的 GCD 和 LCM?
【发布时间】:2012-01-10 16:15:14
【问题描述】:

我目前使用此代码查找 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] 等?我是否受限于循环?

【问题讨论】:

  • 您可以将计算的值保存在某种哈希图中,并首先检查您是否已经计算了该值,如果您不需要重新计算它,否则您将不得不.
  • @Anton。此外,将所有中间结果也保存(缓存)在内存中,并在每次迭代时检查缓存。对于足够大的数字列表,这会更快。
  • 我知道如何使用记忆分类器;我怎么能在这里使用它们?
  • 该问题的答案虽然几乎提供了答案,但如果不是语言,那么它们指的是适当的算法。

标签: math greatest-common-divisor lcm


【解决方案1】:
from fractions import gcd
def lcm(a, b):
    return (a * b) // gcd(a, b)

【讨论】:

    【解决方案2】:

    正如 Chris J this SO question 所述,提供了算法。这是答案的 python 版本,它使用了内置的 reduce 和自 2.6 版以来一直存在的 fractions 模块。

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

    【讨论】:

      【解决方案3】:

      您可以使用递归技术:

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多