求n阶乘尾数中有多少个零

方法1:暴力解

求出n的阶乘,并将该结果通过一次while循环判断,若n%10==0,count++,并将n/=10,退出循环后返回count的值即可。这种方式虽然容易理解,但对于较大的n而言,求出阶乘的结果可能就会发生上溢,因此这种方法不可行。

方法2:统计因数中5的个数

尾数中含有0表示该阶乘结果可以被10整除,10又可以分解成5*2,而因数5的个数相比于因数2要更少,所以每出现一个因数5总有对应的因数2与其相匹配,使末尾多出一个0,故统计因数中含有5的个数即可统计出n阶乘末尾有多少个零。而对于5的幂次如25,125,625...等因数,一个因数中可能会包含多个5,所以需要通过循环来统计该数中含有的5的个数。

int trailingZeroes(int n){
    int count=0;
    while(n){
        count+=n/5;
        n/=5;
    }
    return count;   
}

例:

n=15,含有因数5的因数有5、10、15,此时因数中没有5的幂,循环结束,返回3

n=25,含有因数5的因数有5、10、15、20、25,count在第一次循环时加5,n赋值为5,进入下次循环,count仍要加1,因为25中含有两个因数5,有一个已经在第一次循环加上,所以只需要再加1,最后返回count=6;

n=100,初次循环,count+=20;n=20;对于这20个含有5的因数可以写成5*(1、2、3......20),而这20个数中又可以找到4个包含两个因数5的数,则count+=4;n=4;即(25、50、75、100)=5*5*(1、2、3、4),此时所有的因数5均统计完毕,循环结束时返回count=24。

总结

对于求n阶乘末尾含有0的个数,可以转化为求因数中5的个数的方法来解决问题,这种算法的时间复杂度为O(logn),对于较大的数也可以正确的求出,相比于暴力解法,大大的提高了执行效率。谨以此篇博客记录我的收获,希望以后能学到更多巧妙的方法。

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值