可能重复:
what is the most efficient way to calculate the least common multiple of two integers
Least common multiple for 3 or more numbers
计算给定数字的LCM的简单逻辑是什么?
答案 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_multiple和http://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);
}
(当然这个算法也可以用迭代的方式表达,你可以在谷歌上轻松搜索或自己试试..)