1. 程式人生 > >LeetCode 172.Factorial Trailing Zeroes (階乘後的零)

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;
    }
};