求阶乘末尾几个零

这里有一个问题:给定一个整数N,那么N的阶乘N!的末尾有几个零?例如:N=5,N!=120,N!的末尾有1个零。
用正常思路把N!求出来再看末尾有几个零是不现实的,N如果取得稍微大点很容易就会超过数据的范围。如果换个角度,从哪些数相乘能得到10这个方向思考就简单多了。
25=10,101=10,而101的10可以拆成25,所以我们只要考率N里有多少个5和2,2的数量又是远远多于5的,所以只需要考虑N中有多少个5就好了。
5!=120,N中有一个5,末尾1个0;10!=3628800,N中有两个5,末尾2个0;15!N中3个5,N中有3个0;似乎只需N/5就得到末尾0的个数,但事实不然。
25!中就有6个0,而25/5=5,那多出来的一个5是谁提供的呢?425=100,末尾是两个零,前面多出的一个零就是25提供的,425可以分解为252*5,分解出两个5。所以,再考虑完N/5后我们还要再考虑N中有没有5的m次方的数,像25,125,625这样的数。只需要判断下N/5的结果对5取余后是否为0,若为0说明N中有5的m次方的数,就需要继续除5。
代码很简单,如下所示:

int num;
num=N/5;
while(num%5==0)
{
    num=num+num/5;
}

还有一种升级版:

int num;
while(N)
{
   num+=N/5;
   N/=5;
}

这里是十进制的找0方法,换其余的进制算法流程类似,例如8进制里就找2,3个2就是1个0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值