算法描述
求两个正整数的最大公约数
选择用辗转相除法
step 1
输入两个正整数 a、b
step 2
计算a与b的余数rem
step 3
判断rem是否为0,若不为0,则将rem赋值给b,将b赋值给a,在进行step 2。直到rem的值为0
备注:
由于是a%b,所以a本应为较大的数字,故应先进行判断a与b的大小,但在实际操作中,会发现,假设a=2,b=12,rem=a%b=2,此时,rem不为0,交换数字,a=12,b=2,这个时候,a与b的值进行了交换,a是较大的数字,b是较小的数字。
这个思路减小的代码的长度,比较简单
代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,rem;
scanf("%d%d",&a,&b);
while(1)
{
rem=a%b;
if(rem==0)
{
printf("%d\n",b);
break; //输出最大公约数
}
else
{
a=b;
b=rem; //辗转相除法,把较小的值赋给a,把余数赋给b
}
}
return 0;
}
总结
解决最大公约数一般是用辗转相除法,要先理解辗转相除法解决的思路,在根据思路一步一步地精简代码
辗转相除法:
用较大的数除以较小的数,余数和较小的数构成一对数,继续相除,直到大数被小数除尽为止,则较小的数就是最大公约数。