Question
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
本题难度Easy。
累计法
【复杂度】
时间 O(N) 空间 O(1)
【思路】
技巧在于找到规律:
- 试想
1*2*3*4*5*6*7*8*9*10
,前5个数中有一个2一个5,相乘有一个0,后5个数中有一个10,又有一个0。以此类推,每5个数会有一个0,也就是说有5就有0。 - 我们放大视野再看看
1*2*3*4*5*6*7*8*9*10*...*25
,你会发现25有两个5,也就是说每25个会额外多出1个0。
实际上,从上面我们可以看出规律:每5个计1个0,每25个(5个5)再计1个0,每125个(5个25)再计1个0,以此类推,如同一个金字塔一般:
【代码】
public class Solution {
public int trailingZeroes(int n) {
int sum = 0;
while(n > 0){
// 阶乘中有多少5,结果就有多少个0
sum += n / 5;
//向上累计
n /= 5;
}
return sum;
}
}