原题地点:LeetCode中国-172
题目形貌
给定一个整数 n,返回 n! 效果尾数中零的数目。
示例 1:
输入: 3
输出: 0
诠释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
诠释: 5! = 120, 尾数中有 1 个零.
申明: 你算法的时候复杂度应为 O(log n) 。
剖析
起首暴力破解法就是直接把终究的效果求出来然后看末端有几个0,然则如许做的时候复杂度肯定是太大了。
然后斟酌到末端的0是怎样构成的,起首10=2*5,20=2*2*5,30=3*2*5 … 100=10*2*5
所以,题目的关键是看阶乘内里2和5的数目,然则由于明显2涌现的数目大于5涌现的数目,拿5的阶乘来举例子:
5!= (1) * (2) * (3) * (2*2) * (5)
涌现了3个2、1个5,然则末端只要1个0,所以阶乘末端0的个数就是阶乘式中5的个数。然则如解法1的代码所示,时候复杂度照样太高。
继承斟酌,关于50!,我们能够写成:
5 … 2*5 … 3*5 … 4*5 … 5*5 … 6*5 … 7*5 … 8*5 … 9*5 … 10 * 5
能够看出来从5到10*5一共有10个5,然则关于10来讲,从1到10另有2个5,所以50!的效果末端有12个0
解法1(不符合请求的时候复杂度)
var trailingZeroes = function(n) {
var count = 0;
for(var i = 1;i <= n;i++){
var temp = i;
while(temp%5 === 0){
count++;
temp /= 5;
}
}
return count;
};
上面这个解法的时候复杂度是n*(logn),不符合题意
解法2
var trailingZeroes = function(n) {
var count = 0;
while(n) {
count += divide(n,5);
n = divide(n,5);
}
return count;
};
function divide(n, m) {
return Math.floor(n/m);
}