设计一个算法,计算出n阶乘中尾部零的个数
乍一看so easy 先算阶乘 再看什么时候不能被10整除,很完美,思路也很清晰,但是显然这样做超时是肯定的
于是乎,寻求更简单的解决方法把每个0拆分成2*5,每个偶数都会拆分最少一个2出来,所以5的个数决定了0的个数
public long trailingZeros(long n){
long count = 0;
for(long i=5;i<=n;i=i+5){ //遍历找到5的倍数
long temp = i;
while(temp % 5 == 0){ // 将5的倍数拆分为5*n,计算5的个数
count ++;
temp = temp/5;
}
}
return count;
}
提交时 报了TLE错误,运行了60%的测试数据。
public long getZeroCount(long n){
long count = 0;
while(n/5 != 0){
n = n/5;
count = count + n;
}
return count;
}
最终代码如上,依次求5的n次幂的倍数再相加。