设计一个算法,算出 n 阶乘有多少个尾随零。
你算法的时间复杂度应为 O(log n) 。
显然,暴力是不符合题意的,效率为o(n)所以pass掉暴力,然后我开始也没想出来,查了会资料,结果发现几乎所有CSDN的解法都是复制粘贴同一份资料,气死了。所以我来写一份记录下。
首先我们要观察规律,分析题干,他是要我们找尾巴后面跟着几个0,如果是暴力解法的话,就是算出阶乘后的结果,然后进行遍历/10 %10记录结果。大家要从暴力解法找出一些规律啊,暴力解法本质上就是寻找阶乘中包含10因子的个数,我们再来看看阶乘的规律,就拿25!来说吧
20!=1*2*3*4*5*6*7*8*9*(2*5)*11*12*13*14*(3*5)*16*17*18*19*(5*4)*21*22*23*24*(5*5)
我们可以发现,一个10因子的产生是由2*5组合的,2因子的个数肯定比5因子个数多,你把6,8…拆开就有一个2因子,所以我们只需要找出有多少个5因子个数即可,观察规律我们能发现每隔5个数就能找到1个5,在观察规律发现每隔25个数我们能找到2个5(但是上一次的5已经统计过一次了,所以记为1次),同理125。。。。这样说还不明白的话,看看代码吧
class Solution {
public int trailingZeroes(int n) {
int res=0;
for(long m=5;n/m>0;m*=5){
res+=n/m;
}
return res;
}
}