之前的思路是根据1-10,10个数一个区间分析一个区间产生多少个零,发现这个方法不靠谱,随后阅读资料发现以下思路:
我们会发现一个因子2和因子5组合产生一个0,这样我们只需统计1到n有多少个因子对,即n!的尾随零个数,因子2的个数比因子5的个数多,因此我们只需统计出因子5的个数即可,如
统计一次5的倍数 (5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100)= 20
统计一次25的倍数(因为25的倍数有两个5的因子,所以再统计一次)(25,50,75,100) = 4
统计一次125的倍数(125的倍数由3个5的因子,所以再统计一次,以此类推)(nil)
所以100!的尾随零个数为24个
public class Solution {
/*
* @param n: An integer
* @return: An integer, denote the number of trailing zeros in n!
*/
public long trailingZeros(long n) {
// write your code here, try to do it without arithmetic operators.
long total = 0;
if(n<0)
return -1;
for(long i = 5;i<=n;i = i*5){
total += n/i;
}
return total;
}
}