Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Tags
Math
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
這道題考察的其實是數學知識,來看一下規律。
乘積產生0 也就意味着這個數字分解之後,得到Math.min(2的個數,5的個數)
5 = 5x4x3x2x1 1個5 1個2 => 1個0
6 = 6x5x4x3x2x1 1個5 1個2 => 1個0
10 = 10x9x8x7x6x5x4x3x2x1 2個5 8個2 => 2個0
...
可以看出2始終比5要多,0的個數根據分解出的因子5的個數來定的,因此我們可以算出1~n中,包含5的個數
另外需要注意的是25,125... 本身包含多個5,也是需要囊括進去的。例如28,1~28中,包含5 10 15 20 25,
需要注意的是,25包含兩個5, 也因此 28 有 Math.floor(28/5) + 1 = 6個5。
n!後綴0的個數
= n!質因子中5的個數
= floor(n/5)
+ floor(n/25)
+ floor(n/125)
+ ....
/**
* @param {number} n
* @return {number}
*/
var trailingZeroes = function (n) {
var divider = 5;
var ret = 0;
while (n >= divider) {
ret += Math.floor(n / divider);
divider = divider * 5;
}
return ret;
};