LeetCode 172.Factorial Trailing Zeroes (階乘後的零)
題目描述:
給定一個整數 n,返回 n! 結果尾數中零的數量。
示例 1:
輸入: 3 輸出: 0 解釋: 3! = 6, 尾數中沒有零。
示例 2:
輸入: 5 輸出: 1 解釋: 5! = 120, 尾數中有 1 個零.
說明: 你演算法的時間複雜度應為 O(log n) 。
解題思路:
這個想法是:
0來自10。
10來自2 x 5
我們需要考慮5和2的所有產生。例如4×5 = 20 ...
因此,如果我們將5的所有數字作為一個因子,我們有足夠多的偶數與它們配對以獲得10
例一
1到23之間有多少5的倍數?有5,10,15和20,四個倍數為5.與偶數因子中的2配對,這使得四個因子為10,所以:23!有4個零。
例二
從1到100的數字中有多少個5的倍數?
因為100÷5 = 20,所以,在1和100之間有20×5。
但等等,實際上25是5×5,所以25的每個倍數都有5的額外因子,25×4 = 100,這引入了額外的零。
那麼,我們需要知道有多少25在1~100之間?由於100÷25 = 4,因此在1和100之間存在四個25的倍數。
最後,我們在100中得到20 + 4 = 24個尾隨零!
上面的例子告訴我們,我們需要關心5,5×5,5×5×5,5×5×5×5 ....
例三
由給定的數字4617。
5 ^ 1:4617÷5 = 923.4,所以得到923個因子5
5 ^ 2:4617÷25 = 184.68,因此我們得到184個附加因子5
5 ^ 3:4617÷125 = 36.936,所以我們得到36個額外因子5
5 ^ 4:4617÷625 = 7.3872,因此我們得到7個額外因子5
5 ^ 5:4617÷3125 = 1.47744,所以我們得到1個因子5
5 ^ 6:4617÷15625 = 0.295488,小於1,所以停在這裡。
那麼4617!有923 + 184 + 36 + 7 + 1 = 1151尾隨零。
AC C++ Solution:
class Solution {
public:
int trailingZeroes(int n) {
int cnt = 0;
for(long long i = 5; i <= n; i*=5) {
cnt += (n/i);
}
return cnt;
}
};