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