辗转相除法与更相减损法求最大公约数

辗转相除法: 又名 欧几里德算法(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;
}




发布了35 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Honeycomb_1/article/details/79230504