如何快速求最大公约数和最小公倍数

可以运用辗转相除法,

即:(326,78)=(78,326%78);

        (78,14)  =(14,78%14);

        (14 ,,8 ) =(8,14%8);

          (8,6)    =(6,8%6);

          (6,,2)   =  (2,,6%2=0);

此时结束;这个时候2就是最大公约数

所用原理是:

1:(a,b)=(a,ka+b),其中a、b、k都为自然数  就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数组,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2。这里有一个比较简单的证明方法来说明这个性质:如果p是a和ka+b的公约数,p整除a,也能整除ka+b。那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的。  

 2:(0,a)=a  由这两个性质得到的,就是更相减损术:  (78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2  基本上思路就是大数减去小数,一直减到能算出来为止。不过在平时的计算过程中,往往不必计算到最后一步,比如在上面的过程中,到了(8,6),就已经能够看出其结果。  我们可以看到,在上面的过程中,由 (78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法。

最小公倍数等于,把这两个数用最大公约数除得到的商相乘,再乘以最大公约数,就得到最小公倍数;

#include 
int main()
{
	int a,b,c,d,m,n;
	scanf("%d %d",&a,&b);
	m=a;n=b;
	while(1){//循环的辗转相除法 
		c=a%b;
		a=b;
		b=c;
		if(b==0){
			break;
		}
	}
	c=m/a;d=n/a;//最小公倍数
	n=c*d*a; //的算法 
	printf("%d %d\n",a,n);//循环的辗转相除法的结果 
	return 0;
}


你可能感兴趣的:(如何快速求最大公约数和最小公倍数)