【C语言】最大公约数和最小公倍数
一、最大公约数
定义:最大公约数,也称最大公因数。
对于两个或多个整数来说,最大公约数是指能同时整除这些整数的最大的正整数。例如,对于12和18,能同时整除它们的数有1、2、3、6,其中6是最大的,所以12和18的最大公约数是6。
如果两个数是互质数(即除了1以外没有其他的公因数),那么它们的最大公约数就是1,比如4和9。
1.穷举法
(1)思路:
首先,a,b两数的最大公约数一定<={a,b}min,如48与8的最大公约数一定<=8,那么此时>8的数自然排除。
因为要求的是“最大”公约数,若正序使用++做法,需要将所求公约数不断比较输出较大的那个,不推荐。我们可以直接将较小的数赋值给temp,作为穷举的初始数值,随后不断–,直到穷举出最大公约数,跳出循环并输出。
(2)做法如下:
注:temp = a > b ? b : a即将两数中较小数赋值给temp,
如若想要求出两者中较大数,则变换表达式为a > b ? a : b
2.碾转相除法
(1)解释:
辗转相除法,又名欧几里得算法。
算法原理
- 假设有两个整数a和b(a > b),用a除以b得到余数r。如果r = 0,那么b就是a和b的最大公约数;如果r≠0,就将b赋值给a,r赋值给b,然后继续做除法求余数的操作,如此循环,直到余数为0,此时的除数就是最大公约数。
示例
- 比如求252和105的最大公约数。用252除以105,商是2,余数是42。此时a = 105,b = 42;接着用105除以42,商是2,余数是21,此时a = 42,b = 21;再用42除以21,余数为0,所以252和105的最大公约数是21。
(2)代码体现
int gcd(int a, int b) {
int temp;
while (b!= 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
在代码中,通过 while 循环不断更新a和b的值,直到b为0,最后返回的a就是最大公约数。
(3)举例:
3.更相减损术
(1)原理:
两个正整数a和b(a>b),用较大数减去较小数得到差c,然后将b和c继续比较并以大减小,如此循环,直到两个数相等,这个相等的数就是最大公约数。
(2)代码如下:
二、最小公倍数
1.利用最大公约数
(1)思路:
最小公倍数等于两数之积除以它们的最大公约数
(2)代码如下:
int lcm(int a, int b) {
return a * b / gcd(a, b);//gcd为求出最大公约数的函数名
}
int main() {
int num1 = 12, num2 = 18;
printf("最小公倍数为: %d\n", lcm(num1, num2));
return 0;
}
2.穷举法
(1)思路:
从两个数中较大的数开始,依次递增检查每个数是否能同时被这两个数整除。
第一个能同时被两数整除的数就是它们的最小公倍数。
(2)以下是代码:
注:在这个代码中, lcm 函数先找到 a 和 b 中较大的数 max_num ,然后不断递增 max_num ,直到 max_num 能同时被 a 和 b 整除,此时的 max_num 就是最小公倍数,最后在 main 函数中输出结果。