力扣刷题-阶乘尾数有多少个0

设计一个算法,算出 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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值