【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 函数中输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值