1. 程式人生 > 實用技巧 >LeetCode172. 階乘後的零

LeetCode172. 階乘後的零

參考這個連結

直接計算階乘,再求0的個數肯定會溢位,因為階乘增長的很快。

所以需要觀察一下規律,階乘裡出現0,肯定是能被10整除,而10只能由2*5組成,所以問題就轉換為階乘裡有幾對2和5.

由於2每兩個數就出現一次,5要每5個數出現一次,所以階乘裡2的數量肯定比5多,所以問題又轉換為尋找階乘裡5的數量。

對於一個比較大的數n,每隔25個數會出現兩個5,比如:
.... * (1 * 5) * ... * (1 * 5 * 5) * ... * (2 * 5 * 5) * ... * (3 * 5 * 5) * ... * n
,同理,每隔125(5 * 5 * 5)個數會出現3個5。

所以5出現的規律是:每隔5個數出現一個5,每隔5 * 5個數出現2個5,每隔5 * 5 * 5個數出現3個5,所以最終5的個數就是 n / 5 + n / 25 + n / 125 + .....

根據最前面的分析,5出現的次數就是階乘中0的個數。

程式碼如下:

class Solution {
public:
    int trailingZeroes(int n) {
        int res = 0;
        while(n > 0) {      // 計算5出現的個數
            n /= 5;
            res += n;
        }
        return res;
    }
};