計算n階乘中尾部0的個數
阿新 • • 發佈:2019-02-17
題目描述:
設計一個演算法,計算出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;
}
};