【C语言】求最大公约数
常规解法(枚举)
思路
先找出两个数中的较小数,再从“1~较小数”中寻找一个可以将两个数整除的数。
代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int i = 0;
int maxNum = 0;
scanf("%d %d", &a, &b);
c = a < b ? a : b; //找到较小数
for (i = 1; i <= c; i++)
{
if (a % i == 0 && b % i == 0)
{
maxNum = i; //公因数,循环结束变为最大公因数
}
}
printf("%d和%d的最大公约数为 %d\n", a,b,maxNum);
return 0;
}
运行结果
辗转相除法
思路
辗转相除法又称欧几里得算法,其核心原理:两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
为了方便理解,我们举个例子
代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
while (c = a % b) //a%b为0时,循环停止,求出最大公约数b
{
a = b;
b = c;
}
printf("最大公约数为 %d", b);
return 0;
}
运行结果
补充
在上面的代码中,即使a<b,也可以正常运行,如图