最小公倍數與最大公約數關係:LCM(a,b) = |a*b| / GCD(a,b)。此法效率最高,時間複雜度 O(log min(a,b))。
#include#include long long gcd(long long a, long long b) { while (b) { long long t = a % b; a = b; b = t; } return a; } long long lcm(long long a, long long b) { return llabs(a) / gcd(a, b) * llabs(b); // 先除後乘避免溢位 } int main() { long long a, b; scanf("%lld %lld", &a, &b); printf("%lld\n", lcm(a, b)); return 0; }
原始碼採用從較大數開始,以其倍數測試是否能被較小數整除:
#includeint main() { int a, b, i = 1, temp, lcm; scanf("%d %d", &a, &b); if (a > b) { temp = a; a = b; b = temp; } // 確保 a <= b lcm = b; if (b % a != 0) { while (lcm % a != 0) { lcm = b * i; i++; } } printf("%d", lcm); return 0; }
| 方法 | 時間複雜度 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|---|
| 輾轉相除法 | O(log n) | 所有場景,大數首選 | 極快、標準演算法 | 需理解數學原理 |
| 暴力枚舉法 | O(LCM/a) ≈ O(b) | 教學示範、極小數值 | 直觀易懂 | 大數時極慢,易溢位 |
a * b 可能超出 int 範圍,建議用 long long 並採用 a / gcd * b 順序運算。 提供 std::lcm,C23 也將納入標準。雖然暴力枚舉法邏輯直觀,但實際開發中**強烈建議使用輾轉相除法**,並注意資料型別選擇與溢位防護。