c语言求最大公约数有辗转相除法、更相减损术、穷举法三种。
辗转相除法。算法简介:将两个数a,b相除,如果余数c不等于0,就把b的值给a,c的值给b,直到c等于0,此时最大公约数就是b。
更相减损术。算法简介:将两个数中较大的数a减去较小的数b,如果差c等于0,那么最大公约数为b,如果不等于0,则将b的值给a,c的值给b,继续相减直到差等于0。
穷举法。算法简介:将两个数a,b中较小的值赋给i,将a除以i,b也除以i,若两者的余数同时为0时,此时的i就是两者的最大公约数。若不等于0,则将i-1,继续将a除以i,b除以i,直至余数同时为0。
最大公约数:
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。辗转相除法使用到的原理很聪明也很简单,假设用f(x,y)表示x,y的最大公约数,取k=x/y,b =x%y,则x=ky+ b,如果一个数能够同时整除x和y,则必能同时整除b和y。
而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)(y>0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。
1、相减法
#include&ltstdio.h&gt
int main()
{
int a,b
int c=0//计数器
while(1)//循环判断的作用
{
printf("输入两个数字求最大公约数:")
scanf("%d%d",&a,&b)
while(a!=b)
{
if(a&gtb)
a=a-b
else
b=b-a
c++
}
printf("最大公约数是:%d\n",a)
printf("%d\n",c)
}
return 0
}
运行效果:
2、辗转相除法:
#include&ltstdio.h&gt
int a,b,temp
int Division(){
printf("请输入两个数(a,b):\n")
scanf("%d,%d",&a,&b)
if(a&ltb){
temp=a
a=b
b=temp
}
while(a%b!=0){
temp=a%b
a=b
b=temp
}
printf("最大公约数为:%d\n",b)
return 0
}
3、穷举法
#include&ltstdio.h&gt
int main()
{
int a,b,c
int d=0//计数器
while(1)
{
printf("输入两个数字求最大公约数:")
scanf("%d%d",&a,&b)
c=(a&gtb)?b:a//三目运算符
while(a%c!=0||b%c!=0)
{
c--
d++
}
printf("最大公约数是:%d\n",c)
printf("%d\n",d)
}
return 0
}
代码如下:
#include
int main()
{
int i,a,b,t
scanf(%d%d,&a,&b)//输入数a,b
if(a>b)//比较a,b大小,如果a>b则交换,结果为a<b p=""></b>
{
t=a
a=b
b=t
}
for (i = ai >= 2i--)//以较小的a为基数,每内次i减小1循环求最大公容约数
{
if (a % i == 0 &&b % i == 0)//如果两数均能整除某数则该数为最大公约数
{
printf(最大公约数是:%d\n,i)
break//已得到最大公约数后跳出循环
}
}
if(i==1)//若循环到最后仍无最大公约数则i=1
printf(两数只能同时被1整除!\n)
return 0
}