给定数字的最小公倍数

时间:2010-07-09 16:38:09

标签: c++

7 个答案:

答案 0 :(得分:6)

LCM(a,b)= abs(a * b)/ gcd(a,b)

和gcd算法去那里:

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

答案 1 :(得分:3)

如果 h a b 的HCF(与GCD相同),那么LCM m

给出
m = a * (b / h)

h a b 分开时,您应首先执行除法(如上所述),以降低溢出的风险。

现在您只需要一个HCF算法。有很多,有些非常有效。 例如,请参阅http://rhubbarb.wordpress.com/2009/04/08/hcf-without-division/

对于许多数字而不仅仅是两个数字的LCM,请注意例如

LCM(a,b,c) = LCM(LCM(a,b),c)

例如,请参阅http://en.wikipedia.org/wiki/Least_common_multiplehttp://www.cut-the-knot.org/arithmetic/GcdLcmProperties.shtml

答案 2 :(得分:2)

首先通过Euclid的算法(google)计算GCD,然后使用gcd(a,b)* lcm(a,b)= a * b,但要注意溢出。

答案 3 :(得分:1)

Wikipedia page for LCM上描述了几种算法。

答案 4 :(得分:1)

这是一种思考方式:

最小公倍数包含a和b中的所有因子,但不重复。

最大公约数包含a和b共有的所有因子,否则将被复制。

LCM(a,b)=(仅在a中的因子)*(仅在b中的因子)*(a和b中的因子)
LCM(a,b)=(a / GCD(a,b))*(b / GCD(a,b))* GCD(a,b)
LCM(a,b)=(a / GCD(a,b))* b

此公式计算的中间值小于a * b,因此它比(a * b)/GCD(a,b)更不容易溢出。

答案 5 :(得分:0)

将每个数字分解为一系列相乘的素数。消除第一个系列中也出现在第二个系列中的任何素数。将剩下的所有内容相乘。

可以在Wikipedia上找到对此方法的不同解释。

答案 6 :(得分:0)

一个不适合大数字的好方法是利用GCD和LCM的属性:

int lcm(int a, int b)
{
  return (a*b)/gcd(a,b);
}

您可以使用欧几里得算法轻松找到GCD:

int gcd(int a, int b)
{
  if (b == 0)
    return a;
  else
    return gcd(b, a%b);
}

(当然这个算法也可以用迭代的方式表达,你可以在谷歌上轻松搜索或自己试试..)