求多个数的最大公因数算法 C语言

版权声明:未经允许禁止转载。转载请联系我WX:yuyi5453。并且注明出处 https://blog.csdn.net/weixin_40532377/article/details/86483244

我们用(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;
}

嗯,就是这样。

猜你喜欢

转载自blog.csdn.net/weixin_40532377/article/details/86483244