1. 程式人生 > >計算n階乘中尾部0的個數

計算n階乘中尾部0的個數

題目描述
設計一個演算法,計算出n階乘中尾部零的個數。
eg.
11! = 39916800
輸入11,結果應該返回2。

分析
n的階乘可以分解為k和10的m次冪的乘積,結果result與m相等。
將n的階乘分解,分解為素數的冪的乘積,即n的階乘可以分解為2的x次方,3的y次方,5的z次方,…的乘積。而顯然,只有2*5=10,會產生一個0,則result=min(x,z),顯然z小於x,則result=z。
所以,問題簡化成為求z。

公式(來自程式設計之美)
z=n/5+n/(5*5)+n/(5*5*5)+…+(直到n小於n的a次冪)
解釋:n/5表示能被5整除的數(大於等於5的數,eg. 5,10,15,20等),可以貢獻一個5;n/(5*5)表示能被25整除的數(eg. 25,50,75,100等),可以再貢獻一個5;以此類推,就會得出所有的數目。
程式碼如下:

class Solution {
    /*
     * param n: As desciption
     * return: An integer, denote the number of trailing zeros in n!
     */
    public long trailingZeros(long n) {
        long num = 0;
        while(n > 0) {
            num += n / 5;
            n /= 5;
        }
        return num;
    }
};