哦,原来还可以这样理解阿

看着篇博客: Becoming More Spiritual

我总是说追求精神生活,觉得这是我这个自以为很理性的人唯一感性的地方,现在看来这也是个经济上有利的选择嘛,难道我是完全理性的?hoho
这是一个非常好的问题!你问的是: > **“为什么是这样计算,原来是什么?”** 我们来深入解释一下: 你现在看到的代码中用了一个叫 **欧几里得算法(辗转相除法)** 来求两个数的**最大公约数(GCD)**。那么: --- ### ✅ 为什么可以用 `a, b = b, a % b` 不断取余的方式来求最大公约数? #### 📌 原理来源:**欧几里得定理** 数学上有一个重要结论: > 对任意两个正整数 $ a $ 和 $ b $,有: > > $$ > \gcd(a, b) = \gcd(b, a \mod b) > $$ 只要 $ b \neq 0 $。 这个定理是欧几里得在《几何原本》中提出的,因此这个方法被称为 **欧几里得算法**。 --- ### 🔍 直观理解:为什么成立? 假设我们要算 $ \gcd(48, 18) $ 按照公式一步步来: 1. $ \gcd(48, 18) = \gcd(18, 48 \mod 18) = \gcd(18, 12) $ 2. $ \gcd(18, 12) = \gcd(12, 18 \mod 12) = \gcd(12, 6) $ 3. $ \gcd(12, 6) = \gcd(6, 12 \mod 6) = \gcd(6, 0) $ 当第二个数变成 0 时,第一个数就是最大公约数 → 所以 GCD 是 **6** ✅ 这比暴力枚举所有因数快得多! --- ### 💡 类比生活例子(帮助理解) 想象你要用同样大小的正方形瓷砖去铺一个 $48 \times 18$ 的矩形区域,要求: - 正好铺满,不留空隙; - 瓷砖尽可能大。 那么最大的瓷砖边长是多少?—— 就是这两个数的**最大公约数**! 而欧几里得算法就像不断从大矩形里剪掉正方形,剩下的小矩形继续剪,直到不能再剪为止。 ``` 48×18 的矩形: ├── 剪掉一个 18×18 的正方形 → 剩下 30×18 ├── 再剪一个 18×18 → 剩下 12×18 └── 现在变成 18×12,交换方向... ├── 剪 12×12 → 剩下 6×12 └── 继续... 最后剩下的是 6×6,刚好能铺完。 → 所以最大边长是 6。 ``` 这和取模运算本质一致: $ 48 \div 18 = 2 $ 余 $ 12 $ → 相当于剪了两块还剩 $12$ --- ### ❓ 那“原来”是怎么算的?(没有这个算法之前的方法) 在计算机出现前或教学初期,人们通常使用以下方式求 GCD: #### 方法一:**质因数分解法** 比如: - $ 48 = 2^4 \times 3 $ - $ 18 = 2 \times 3^2 $ - 公共部分:$ 2^1 \times 3^1 = 6 $ 所以 $ \gcd(48,18)=6 $ ✅ 正确但慢,尤其对大数难以分解。 #### 方法二:**穷举法(暴力尝试)** 从较小的那个数开始往下试: ```python def gcd_brute_force(a, b): min_num = min(a, b) for i in range(min_num, 0, -1): if a % i == 0 and b % i == 0: return i ``` 对于小数字可以,但效率是 $ O(n) $,非常慢。 相比之下,**欧几里得算法的时间复杂度只有 $ O(\log \min(a,b)) $**,快得多! --- ### ✅ 最小公倍数(LCM)又是怎么来的? 有个经典公式: $$ \text{lcm}(a, b) = \frac{a \times b}{\gcd(a, b)} $$ 比如: $ a=48, b=18, \gcd=6 $ → $ \text{lcm} = (48×18)/6 = 864 / 6 = 144 $ 验证: - 48 的倍数:48, 96, 144, ... - 18 的倍数:18, 36, 54, 72, 90, 108, 126, 144, ... 最小公共倍数确实是 144。 ⚠️ 注意:必须先算 GCD,再用乘积除以 GCD 得 LCM。不能反过来。 --- ### ✅ 总结:你现在看到的算法“原来是”什么? | 项目 | 原始方法(朴素) | 现代高效方法(你现在用的) | |------|------------------|----------------------------| | 求 GCD | 质因数分解 或 穷举 | 欧几里得算法(取模迭代) | | 时间复杂度 | $ O(n) $ 或更差 | $ O(\log n) $,极快 | | 是否适合编程 | 可行但低效 | 推荐标准做法 | 你现在写的代码正是基于这个高效数学原理实现的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值