辗转相除法: 又名
欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
另一种求两数的最大公约数的方法是
更相减损法,又称"等值算法"。
第一招:辗转相除法
1、递归
#include <stdio.h>
int gcd(int x,int y)
{
if(!y)//如果y等于0时则找到结束
return x;
else
return gcd(y,x%y);
}
int main()
{
int a,b,tnt;
scanf("%d%d",&a,&b);
if(a>b)
tnt=gcd(a,b);
else
tnt=gcd(b,a);
printf("%d",tnt);
return 0;
}
2、非递归
#include <stdio.h>
int main()
{
int m,n,temp,i;
scanf("%d%d",&m,&n);
if(m>n)//取最小的数
{ temp=m;
m=n;
n=temp;
}
for(i=m;i>=0;i--)
if((n%i==0)&&(m%i==0))//枚举只要i都能被两个数整除
{ printf("%d\n",i);
break;
}
return 0;
}
第二招:更相减损法
#include <stdio.h>
int f(int a,int b)
{
while(a!=b)
{
if(a>b)
a-=b;
else
b-=a;
}
return a;
}
int main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d",f(m,n));
return 0;
}