辗转相除法求两个数的最大公约数
辗转相除法, 又名欧几里德算法(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;
}