欧几里得算法
一
首先我们要有一个数学知识:
L
C
M
(
A
,
B
)
=
(
A
∗
B
)
/
G
C
D
(
A
,
B
)
LCM(A, B) = (A * B) / GCD(A, B)
LCM(A,B)=(A∗B)/GCD(A,B)
这边对上面的名称做一下解释,LCM是指最小公倍数,GCD是指最大公约数
因为我们这是写程序,还要防止爆int所以求的时候我们一般稳一点就采用先除再乘的原则(和求平均数大同小异),即
L
C
M
(
A
,
B
)
=
A
∗
(
B
/
G
C
D
(
A
,
B
)
)
LCM(A, B) = A * (B / GCD(A, B))
LCM(A,B)=A∗(B/GCD(A,B))。
二
同时有人可能小学时学过的奥数也学过辗转相除法也可以得到GCD,这里就不详细讲了,有兴趣的自己百度一下吧。
三、代码
一、非递归版
int gcd(int da, int xiao)
{
int temp;
while(xiao != 0)
{
temp = da % xiao;
da = xiao;
xiao = temp;
}
return da;
}
注意这段代码变量da,xiao对变量的大小要求不是很严,就是如果你输入的xiao比da的数大,依旧可以通过走一次while的过程,将两个变量的大小进行调换,从而继续辗转相除。
二、递归版
int gcd(int a,int b) {
return b>0 ? gcd(b,a%b):a;
}
三、库函数版
#include<algorithm>
using namespace std;
int a, b;
int main()
{
int t = __gcd(a, b);
return 0;
}
c++库algorithm自带gcd函数