Trailing Zeros

225 篇文章 0 订阅

Write an algorithm which computes the number of trailing zeros in n factorial.

Example

11! = 39916800, so the out should be 2


这道题不是第一次做了,但是思路总是很凌乱。应该说数学正常的人应该不难做出来,而我有的时候真的是混乱。。


说这道题要求的是阶乘后部0的个数,很自然的想到,是通过因式分解找到2 5 的个数,那么很容易能够考虑到,2的个数是一定比5多的。拿11来说,  


1 2 3 4 5 6 7 8 9 10 11, 里边包含的2的个数有: 2(1个),4(2个),6(1个),8(3个);而5的个数只有两个5, 10;

因此问题也转化成了统计5的个数。

11/5 = 2;说明1~11中包含两个五;分别是5, 10(2*5);11/5= 2 2里边就不剩5了,所以最终的结果就是2个。


再拿大一点的数举例:

25:

25/5 = 5;首先,25里边有五个数字里边包含5: 5,10,15,20,25;5/5=1;说明5里边也有一个5;所以全部加起来一共是6个5。所以结果是6个0;注意的是25里可以提供两个5,所以循环的第一次的结果5还可以继续计算,直至结果小于5


代码:

public long trailingZeros(long n) {
        // write your code here
        //11 11 / 5 = 2 
        long count = 0;
        while(n >5){
            count += n/5;
            n = n/5;
        }
        return count;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值