C语言。求两个数的最大公约数,最小公倍数,辗转相除法

辗转相除法求两个数的最大公约数

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

基本原理

两个数的最大公约数是指能同时整除它们的最大正整数。 

设两数为a、b(a≥b),求a和b最大公约数  的步骤如下:

(1)用a除以b(a≥b),得  。

(2)若  ,则  ;

(3)若  ,则再用b除以  ,得  .

(4)若 ,则  ;若  ,则继续用  除以  ,......,如此下去,直到能整除为止。其最后一个余数为0的除数即为  的最大公约数。

证明

设两数为a、b(a>b),用  表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即  。

辗转相除法即是要证明  。

第一步:令  ,则设 

第二步:根据前提可知 

第三步:根据第二步结果可知, 也是  的因数

第四步:可以断定  与  互质(这里用反证法进行证明:设  ,则 

 ,

 ,则a与b的一个公约数  ,

故c非a与b的最大公约数,与前面结论矛盾,因此c也是b与r的最大公约数)从而可知

  ,继而 。

证毕

注:以上步骤的操作是建立在刚开始时  的基础之上的,即m与n亦互质。 

#include<stdio.h>

int GCD(int a,int b);

int main(){
	int a,b,gcd;
	scanf("%d%d",&a,&b);
	gcd=GCD(a,b); 
	printf("GCD=%d\n",gcd);
	printf("LCM=%d\n",a*b/gcd);
    return 0;
}


int GCD(int a,int b){
	int n;
	n=b;
	while(n!=0){
		n=a%b;
		if(n!=0) {
		a=b;
		b=n;
		}
	}
	return b;
}

一般方法

#include<stdio.h>
int gcd( int x, int y );
int main(){
	int a,b,gcd;
	scanf("%d%d",&a,&b);
	gcd=GCD(a,b); 
	printf("GCD=%d\n",gcd);
	printf("LCM=%d\n",a*b/gcd);
    return 0;
}

int gcd( int x, int y ){
	int t,i;
	for(i=1;i<y+1;i++)
	if(x%i==0&&y%i==0) t=i;
	return t;
}
发布了30 篇原创文章 · 获赞 47 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44040023/article/details/90902248