辗转相除法
思路:将两个数a和b相除得到结果c,如果余数c不为0,则把b赋给a,把c赋给b,直到结果为0,此时b就是最大公约数。
代码如下:
int main()
{
int a, b, c = 0;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
while (c = a % b)
{
a = b;
b = c;
}
printf("最大公约数为:%d\n", b);
return 0;
}
注意:这里不需要提前判断a和b的大小,假设a小于b,用a%b得到余数c为a,再进行a = b,b = c的操作时,相当于对a,b的数值进行了交换,所以不需要提前判断。
相减法
思路:和辗转相除法类似,不过这次需要提前比较两个数a和b的大小,然后用最大数(假设为a)减去最小数(假设为b)得到结果c,如果c等于0,最大公约数为b,如果c不等于0,就将b赋给a,将c赋给b,直至结果c为0,此时的b就是这两个数的最大公约数。
代码如下:
int main()
{
int a, b, c = 0;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
if (a < b)
{
int tmp = a;
a = b;
b = tmp;
}
while (c = a - b)
{
a = b;
b = c;
}
printf("最大公约数为:%d\n",b);
return 0;
}
穷举法
思路:穷举法相对于前面两种算法比较麻烦,比较两个数a和b,找出其中较小的数(假设为a)赋给t,然后用a和b分别去除t,如果两个结果同时为0,此时的t就是二者的最大公约数,如果不为0,就对t进行减1操作,继续用a和b分别去除t,直到这两个结果同时为0。
代码如下:
int main()
{
int a, b, t;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
if (a < b)
{
t = a;
}
else
{
t = b;
}
for (t; t>0; t--)
{
if ((a%t == 0) && (b%t == 0))
break;
}
printf("最大公约数为:%d\n", t);
return 0;
}