C语言求两个正整数的最大公约数

这里将介绍的是求两个正整数的最大公约数(Greatest Common Divisor,GCD)的三种方法,分别为连续整除检测法,欧几里得算法,相减法。下面来介绍这三种方法。

连续整除检测法

这种方法的实现原理是,先取出两个数中的较小数,赋值给temp(temporary),接着用其中一个数与temp求余,若余数不为0,则temp-1,循环该步骤直到余数为0。再用另一个数,重复此步骤,最后得出的值为这两个数的最大公约数。

代码如下:

#include
int main()
{
	int i=0;
	int m,n,temp;
	printf("请输入两个正整数:");
	scanf("%d %d",&m,&n);
    if(m>n)   
	{
    	temp=n;
	}else   //m=n在此不需要单独讨论 
	{
		temp=m;
	}
	for(i=temp;i>0;i--)   //如果从i=1开始,得出公约数也无法保证其为最大公约数。 
	{
		if(m%i==0 && n%i==0)
			break;
	}
	printf("%d和%d的最大公约数是%d",m,n,i);
	return 0;
}

欧几里得算法

这种方法的实现原理是求两个正整数的余数r(remainder),再用两个正整数中的较小数与其再求余直到余数为0时,此时的较小数就是最大公约数。

代码如下:

#include
int main()
{
	int m,n,r;
	printf("请输入两个正整数:");
	scanf("%d %d",&m,&n);
	printf("%d%和%d的最大公约数是",m,n);   //此时输出m和n的值还没改变 
	r=m%n;
    while(r!=0)   //不用比较大小,若m小于n,则会在第一遍循环交换位置 
	{
    	m=n;
    	n=r;
    	r=m%n;
	}
	printf("%d",n);
	return 0;
} 
 

相减法

这种方法比较易于理解,原理是先判断两个正整数大小,并将较大数与较小数的差值赋给较大数,循环此步骤直到两数相等,此时得出最大公约数。

代码如下:

#include
int main()
{
	int m,n;
	printf("请输入两个正整数:");
	scanf("%d %d",&m,&n);
	printf("%d%和%d的最大公约数是",m,n);
    while(m!=n)
	{
		if(m>n)
		{
			m=m-n;
		}else
		{
			n=n-m;
		}	
	}
	printf("%d",n);
	return 0;
} 
 

最后把这三种方法构建为函数gcd并尝试调用。

代码如下:

#include

int gcd1(int m,int n)
{
	int i=0;
	int temp;
    if(m>n)   
	{
    	temp=n;
	}else   //m=n在此不需要单独讨论 
	{
		temp=m;
	}
	for(i=temp;i>0;i--)   //如果从i=1开始,得出公约数也无法保证其为最大公约数。 
	{
		if(m%i==0 && n%i==0)
			break;
	}
	return i;
}

int gcd2(int m,int n)
{
	int r=m%n;
    while(r!=0)   //不用比较大小,若m小于n,则会在第一遍循环交换位置 
	{
    	m=n;
    	n=r;
    	r=m%n;
	}
	return n;
}

int gcd3(int m,int n)
{
	while(m!=n)
	{
		if(m>n)
		{
			m=m-n;
		}else
		{
			n=n-m;
		}	
	}
	return n;
}

int main()
{
    printf("请输入两个正整数: ");
	int x,y;
	scanf("%d %d",&x,&y);
	int a=gcd1(x,y);
	int b=gcd2(x,y);
	int c=gcd3(x,y);
	printf("%d和%d的最大公约数为%d\n",x,y,a);
	printf("%d和%d的最大公约数为%d\n",x,y,b);
	printf("%d和%d的最大公约数为%d",x,y,c);
	return 0;
}

尝试运行结果:
C语言求两个正整数的最大公约数_第1张图片
得出最大公约数后可借助其求出最小公倍数,相关内容及方法我在另一篇文章中有所介绍(文章链接如下)
求两个正整数的最小公倍数的两种方法

你可能感兴趣的:(c语言)