题目
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
分析
Note中提示让用对数的时间复杂度求解,那么如果粗暴的算出N的阶乘然后看末尾0的个数是不可能的。
所以仔细分析,N! = 1 * 2 * 3 * ... * N 而末尾0的个数只与这些乘数中5和2的个数有关,因为每出现一对5和2就会产生一个10那么N!末尾一定会有一个0。然而进一步分析会发现,因子中2的个数肯定是大于5的个数,所以我们只要找出N!中因子5的总个数即可。
1.给定N那么N/5会得到所有5*1, 5*2, 5*3......的个数
2.N/25会得到所有25*1, 25*2, 25*3.....的个数
3.N/125会得到所有125*1, 125*2, 125*3.......的个数
........
可能会有疑问,25中有两个5,125中有3个5会不会少算,但是仔细观察会发现,在第1步中已经对25的情况算了一次,第2步相当于把另一个5统计进来,以此类推
代码
public int trailingZeroes(int n) {
int rs = 0;
while (n != 0) {
rs += (n / 5);
n /= 5;
}
return rs;
}
这样就得出了结果