在程式設計面試中,求階乘(n!)結果末尾連續零的個數是經典題目之一。這道題的核心在於理解零的來源:每一個 10 都由 2 與 5 相乘產生,而在階乘的質因數分解中,2 的個數遠多於 5,因此末尾零的個數實際上取決於質因數 5 的總數。
若直接計算 n! 會迅速溢位,且效率低落。正確的做法是統計 1 到 n 中所有 5 的倍數貢獻的 5 的個數:
以下 C 語言函式以 O(log₅ n) 時間複雜度解決問題,無需陣列、無記憶體配置,碾壓原文中模擬乘除的暴力做法:
int countTrailingZeros(int n) {
if (n < 0) return 0;
int count = 0;
for (long long divisor = 5; divisor <= n; divisor *= 5) {
count += n / divisor;
}
return count;
}
long long,避免乘法過程溢位導致無限迴圈。| n | n! | 末尾零數 | 函式回傳 |
|---|---|---|---|
| 5 | 120 | 1 | 1 |
| 10 | 3628800 | 2 | 2 |
| 25 | …000000 | 6 | 6 |
| 100 | … | 24 | 24 |
若面試官追問「為什麼不數 2 的個數?」,答:2 的個數遠大於 5,5 才是瓶頸。若問「如何擴展到任意進位制?」,則需分解該進位制的質因數,取各質因數個數除以其在進位制中冪次的最小值。
掌握數學本質、拒絕暴力模擬,是演算法優化的關鍵。這個 O(log n) 解法不僅標準、高效,更能展現應聘者的數學直覺與工程思維。