2. 尾部的零

描述
设计一个算法,计算出n阶乘中尾部零的个数

您在真实的面试中是否遇到过这个题?
样例
样例 1:
输入: 11
输出: 2

样例解释:
11! = 39916800, 结尾的0有2个。

样例 2:
输入: 5
输出: 1

样例解释:
5! = 120, 结尾的0有1个。

挑战
O(logN)的时间复杂度

解释:
能产生0的肯定是5和双数相乘,或者10、20等10的倍数,所以以5为单位依次比较发现规律
规律
// 5 1
// 10 2(10/5)
// 15 3(15/5)
// 20 4(20/5)
// 25 5(25/5) + 1 (5/5)
// 105 = 21(105/5) + 4(21/5)
// 150 = 30(150/5) + 6(30/5) + 1(6/5)
// 500000030 = 100 000 006 + 20 000 001 + 4 000 000 + 800 000 + 160 000 + 32000 + 6400 + 1280 + 256 + 51 + 10 + 2

根据规律可得代码:

public long trailingZeros(long n) {

        long nums = n / 5;
        long sums = nums;
        
        while(nums/5 > 0) {
            
            sums += nums/5;
            nums = nums/5;
        }
        return sums; 
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值