給定整數 n,求 n! 末尾連續 0 的個數。本文揭示尾部 0 來源於因子 2×5,因 2 遠多於 5,問題轉化為統計 n! 中因子 5 的個數,給出 O(log₅ n) 時間、O(1) 空間的極簡數學解法。
尾部 0 由 10 產生,10 = 2 × 5。在 n! 的質因數分解中,因子 2 的個數遠大於因子 5(每隔 2 個數有一個 2,每隔 5 個數才有一個 5)。因此,**尾部 0 的個數 = n! 中因子 5 的總個數**。
每 5 個數貢獻至少一個 5(5, 10, 15...),每 25 個數額外貢獻一個 5(25=5²),每 125 個數再額外貢獻一個 5(125=5³)……
count = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + ... 直到商為 0
int trailingZeroes(int n) {
int count = 0;
while (n > 0) {
n /= 5;
count += n;
}
return count;
}
int trailingZeroes(int n) {
if (n == 0) return 0;
return n/5 + trailingZeroes(n/5);
}
| n | n! | 尾部0個數 | 計算過程 |
|---|---|---|---|
| 3 | 6 | 0 | 3/5=0 |
| 5 | 120 | 1 | 5/5=1 |
| 10 | 3628800 | 2 | 10/5=2, 2/5=0 → 2 |
| 25 | ... | 6 | 25/5=5, 5/5=1 → 6 |
| 100 | ... | 24 | 100/5=20, 20/5=4, 4/5=0 → 24 |
若求 n! 在 b 進制下尾部 0 個數:分解 b = p₁^e₁ * p₂^e₂ ...,對每個質因子 pᵢ 計算 n! 中 pᵢ 的指數 cntᵢ,答案為 min(cntᵢ / eᵢ)。
階乘尾部零計數是「質因數分解思想」在算法題中的經典應用。將「計算巨大數值」轉化為「統計質因子指數」,以 O(log n) 時間解決看似需要大數運算的問題,體現了數學建模在算法優化中的核心價值。