我们用(a1,a2,....)表示最大公因数 [a1,a2,.....]表示最小公倍数
1、两个数的最大公因数
辗转相除法,可以直接使用C语言自带的 c = __gcd(a,b);
辗转相除法原理可以自行百度。
2、多个数以上的最大公因数
1、多次辗转相除法
1.使用辗转相除法求a1和a2的最大公因数(a1,a2)
2.使用辗转相除法求(a1,a2)和 a3 的最大公因数(a1,a2,a3);
3.重复,得到(a1,...,an)
代码
int Gcd(int a[],int n){ //多次辗转相处法
int ans = a[0];
for(int i=1;i<n;i++){
ans = __gcd(ans,a[i]);
}
return ans;
}
2、变换法
1、找到a1,a2,..,an中的最小非零项aj,若有多个最小非零项则任取一个
2、 aj以外的所有其他非0项ak用ak mod aj代替;若没有除aj以外的其他非0项,则转到(4)
3、转到 1
4、 a1,a2,..,an的最大公约数为aj
代码
int Gcd2(int a[],int n){ //变换法
int Min=a[0],pos=0,conter=0;
while(conter<n-1){
for(int i=0;i<n;i++){
if(a[i] && a[i]<Min){
Min=a[i];
pos=i;
}
}
for(int i=0;i<n;i++){
if(i==pos) continue;
a[i]=a[i]%Min;
if(!a[i]) conter++;
}
}
for(int i=0;i<n;i++)
if(a[i]) return a[i];
}
3、两个数多的最小公倍数
公式:a*b=[a,b]*(a,b)
4、多个数的最小公倍数
多个数的最小公倍数并无像两个数的最小公倍数的计算公式
公式:[a1,a2,..,an]=M/(M/a1,M/a2,..,M/an) 其中M为a1,a2,..,an的乘积
1、计算m=a1*a2*..*an
2、把a1,a2,..,an中的所有项ai用m/ai代换
3、找到a1,a2,..,an中的最小非零项aj,若有多个最小非零项则任取一个
4、aj以外的所有其他非0项ak用ak mod aj代替;若没有除aj以外的其他非0项,则转到(6)
5、转到(3)
6、最小公倍数为m/aj
代码:
int Lcm(int a[],int n){
int m=1;
for(int i=0;i<n;i++) //求积
m*=a[i];
for(int i=0;i<n;i++)
a[i]=m/a[i];
int gcd=Gcd2(a,n);
// int gcd=Gcd(a,n);
return m/gcd;
}
嗯,就是这样。