gcd的一些用法
最大公因数与最小公倍数
✅ 什么是欧几里得算法(辗转相除法)?
一句话:
就是不断用“大数 ÷ 小数”,然后把“小数”与“余数”继续来除,直到余数变成 0,那个最后的除数就是最大公因数。
✅ 为什么这么做是对的?(傻瓜理解逻辑)
假设你要找两个数的最大公因数,比如 18 和 12。
你可能第一想法:
“我把它们俩共同的因数列出来比较一下?”
18 的因数:1 2 3 6 9 18
12 的因数:1 2 3 4 6 12
共同的:1 2 3 6
最大:6
对!结果是6。
但欧几里得算法的做法是:
✅ 按步骤傻瓜化演示(以 18 和 12 为例)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 18 ÷ 12 = 商 1 余 6 | 原来18和12的“共同因数”能帮我产生这个 6 |
| 2 | 接下来把“12”和“6”继续做除法 | 也就是 12 ÷ 6 |
| 3 | 12 ÷ 6 = 商 2 余 0 | 余数为0说明整除了 |
| 4 | 最后一次 被除数 就是最大公因数 | 6 就是最大公因数 |
记住一句核心口诀:
大数 ÷ 小数 = 余数
再用小数 ÷ 余数
循环到余数是0为止
最后的除数 = 最大公因数
✅ 再举一个(稍微难一点)
求 144 和 60 的最大公因数:
| 步骤 | 计算 | 余数 | 继续 |
|---|---|---|---|
| 1 | 144 ÷ 60 | 24 | 再用 60 ÷ 24 |
| 2 | 60 ÷ 24 | 12 | 再用 24 ÷ 12 |
| 3 | 24 ÷ 12 | 0 | 余数为0 |
| 结束 | 最大公因数 = 12 |
所以 gcd(144, 60) = 12
✅ 为什么“余数”还能继续当“测量尺”?
可以这样理解:
你是在找一个能把两个数都整除的“最大尺子”。
第一次除法把“大尺子测不准的部分”(多出来的)变成了“余数”,
后面继续用“更精准的尺子”(余数)去替代原本的小的那个数。
不断“削小尺子”,直到它完全贴合。
贴合时就是最大公因数。
✅ 用一句最通俗的话总结
不断用更小的尺子去量两个数,直到刚好不剩丁点,这个尺子就是最大公因数
[!NOTE]
公式:gcd(a, b) = gcd(b, a % b)
最小公倍数求法
✅ 但是列倍数太慢,所以有了一个超级快的公式
数学上有个结论(可靠且可以证明):
两个数的乘积 = 最大公因数 × 最小公倍数
所以推出来:
最小公倍数 = (a × b) ÷ 最大公因数
这个公式就是最常用的方法。
✅ 举个例子
求 12 和 18 的最小公倍数
- 先求最大公因数
gcd(12, 18) = 6 (辗转相除法能算出来) - 用公式
lcm = (12 × 18) ÷ 6
= 216 ÷ 6
= 36
所以 最小公倍数 = 36
✅ 为什么乘积除以 gcd 就对了?(傻瓜解释)
因为:
| 项目 | 理解方式 |
|---|---|
| 乘积 | 把两个数的所有因子都堆上去了(重复了一部分) |
| gcd | 是那部分“重复”的公共身份 |
| 除 gcd | 就把“重复部分”扣掉,只剩下最刚好的倍数 |
✅ 最通俗一句话
最小公倍数就是:两个数的乘积,把重复分母(最大公因数)扣掉后的结果。
如果你现在理解了原理,下一步我可以给你写最小公倍数的 C 语言代码,并且逐行教你怎么写、为什么这么写。
代码演示
1 | /* |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 mymod的博客!
