C语言---求n的阶乘后面有多少个连续的0

C语言---求n的阶乘后面有多少个连续的0

题目描述:给定一个正整数n,返回n的阶乘尾部连续0的个数。

例如:(5,5*4*3*2*1=120,则返回1),(10,10*9*8*7*6*5*4*3*2*1=3628800,则返回2)

 

题目分析:首先拿到这道题,直接可以想到最简单的方法就是,通过循环算出这个值,然会取个位,减个位,统计一下个数即可。但是运行后就发现不可行,因为如果n稍微大一点,则算出的这个值就太大了,保存不了,且运行超时,所以这种方法不可行。

于是就得想别的方法了,最后上网查资料发现还有一种巧妙的解法,那就是将可以造成尾部出现0的情况进行分析,发现10可以由2*5造成,发现20可以由2*2*5造成,发现100可以由2*2*5*5造成。。。

 

多试几组数据,可以发现其规律:尾部0的个数等于min{2的个数,5的个数}

因为尾部的0是由2*5得来的,虽然也可能是4*5得来的,但是4也是由2*2得来的,所以尾部的0根本上是由2*5得来的。

 

这里可以发现:一对2和5可以造成尾部一个0,n对2和5可以造成尾部n个0,但是由于2可以由太多太多的数据分解得来,所以我们这

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值