題目連結:
題目意譯:
給定一整數 n,回傳 n! 末尾的 0 之數量。
注:你的解答應為對數時間複雜度。
範例測資:
範例 1:
輸入: 3
輸出: 0
解釋: 3! = 6 , 沒有末尾的 0 。
範例 2:
輸入: 5
輸出: 1
解釋: 5! = 120 , 有一個末尾 0 。
解題思維:
可以看到每個 0 的出現,同時代表著 n! 裡有著一個 10 的乘積。
而因為 10 = 2 × 5 且 2 < 5 ,因此在 n! 中,是 2 的倍數的數字肯定比 5 的倍數的數字來得多。
因此只要看 n! 中有多少個「5」,就可以知道有多少個「10」,即是「0」的數量。
而「5」在乘積中的次方可由下求出:
先計算 floor(n ÷ 5) 的值,代表 5 的倍數有多少個。這些數字各自貢獻一個「5」的次方。
再計算 floor(n ÷ 25) 的值,代表 25 的倍數有多少個。這些數字除了像 5 的倍數貢獻一個次方以外,還會再貢獻另一個次方。
再來計算 floor(n ÷ 125) 的值,代表 125 的倍數有多少個。這些數字除了像 25 的倍數貢獻兩個次方以外,還會再貢獻另一個次方。
……
以此類推。其中 floor 函式代表下高斯函數,對於非負整數來說等同無條件捨去小數點。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。