描述
設計一個算法,計算出n階乘中尾部零的個數
樣例
樣例 1:
輸入: 11
輸出: 2
樣例解釋:
11! = 39916800, 結尾的0有2個。
樣例 2:
輸入: 5
輸出: 1
樣例解釋:
5! = 120, 結尾的0有1個。
挑戰
O(logN)的時間複雜度
算法思路
首先,我們需要知道N的階乘是如何運算的
N! 代表N的階乘
N! = 1 * 2 * 3 * 4 * 5 * 6 * 7 ... * N-1 * N
簡而言之,就是從1乘到N
然後,我們需要知道尾部的0是如何出現的
經過觀察,我們發現尾部的0是 5和偶數相乘 得到的
所以該問題轉換爲從1乘到N,裏面有多少個5相乘
從1開始,那麼每數5個數一定是5的倍數,即最少含有一個5進行最後的乘法運算
所以我們首先以5作爲步長,可查出有多少個符合條件的數 即 a = N/5
我們定義sum = 0 爲N的階乘尾部的0的結果
我們將算得的數字加起來 sum += a
它們類似:
5 10 15 20 25 30 35 40 45 50 55 60...
但其中有些5的倍數中,還存在多個5相乘,比如25是5 * 5,125是5 * 5 * 5,也需要計算出來
根據規律,每5個又會多出現一個5,所以再除以5 a = a/5
我們將算得的數字加起來 sum += a
它們類似:
25 50 75 100 125 150 175 200 225 ...
此時我們已經計算出兩個5,但數據中還可能出現包含更多5的數字,如125包含3個5相乘,也需要計算出來
根據規律,每5個又會多出現一個5相乘,所以再除以5 a = a/5
我們將算得的數字加起來 sum += a
以此類推,直至除得的結果除不開五,sum即爲所求0的數量
代碼
public static long getZero(long num) {
long sum = 0;
while (num != 0) {
num /= 5;
sum += num;
}
return sum;
}