这里将介绍的是求两个正整数的最大公约数(Greatest Common Divisor,GCD)的三种方法,分别为连续整除检测法,欧几里得算法,相减法。下面来介绍这三种方法。
连续整除检测法
这种方法的实现原理是,先取出两个数中的较小数,赋值给temp(temporary),接着用其中一个数与temp求余,若余数不为0,则temp-1,循环该步骤直到余数为0。再用另一个数,重复此步骤,最后得出的值为这两个数的最大公约数。
代码如下:
#include<stdio.h>
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<stdio.h>
int main()
{
int m,n,r;
printf("请输入两个正整数:");
scanf("%d %d",&m,&n);
printf("%d%和%d的最大公约数是",m,n); //此时输出m和n的值还没改变
r=m%n;
do //不用比较大小,若m小于n,则会在第一遍循环交换位置
{
m=n;
n=r;
r=m%n;
}while(r!=0);
printf("%d",n);
return 0;
}
相减法
这种方法比较易于理解,原理是先判断两个正整数大小,并将较大数与较小数的差值赋给较大数,循环此步骤直到两数相等,此时得出最大公约数。
代码如下:
#include<stdio.h>
int main()
{
int m,n;
printf("请输入两个正整数:");
scanf("%d %d",&m,&n);
printf("%d%和%d的最大公约数是",m,n);
do
{
if(m>n)
{
m=m-n;
}else
{
n=n-m;
}
}while(m!=n);
printf("%d",n);
return 0;
}
最后把这三种方法构建为函数gcd并尝试调用。
代码如下:
#include<stdio.h>
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;
do //不用比较大小,若m小于n,则会在第一遍循环交换位置
{
m=n;
n=r;
r=m%n;
}while(r!=0);
return n;
}
int gcd3(int m,int n)
{
do
{
if(m>n)
{
m=m-n;
}else
{
n=n-m;
}
}while(m!=n);
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;
}
尝试运行结果:
得出最大公约数后可借助其求出最小公倍数,相关内容及方法我在另一篇文章中有所介绍(文章链接如下)
求两个正整数的最小公倍数的两种方法