计算阶乘末尾0的个数



这个题目是编程之美上出现的,今年在几个公司笔试的时候都出现了这个题目,之前一直以为 直接用 N  /  5 就是结果,昨天被土豆面试的时候,才发现自己理解错了,思路是这样的,0 的个数就是 1,,2,...,n中n个数中能够分解出5的因子的个数。之前以为 5,10,20,..., n/5 * 5   总共有  n/5个能够提出5的因子的,但是显然这里出现了问题,对于 25 这个数 = 5^2 能提出两个5的因子,所以应该会产生两个0。那我们该怎么解决这个问题呢,我们将5,10,20,....,n/5 * 5  提出一个因子5 ,5*1,5*2,5*3,5*4,5*5,5*(n/5) 即 5(1,,2,3,4,...,n/5) 后面括号中又会产生5,而且是按照前面同样的方式。 所有能够产生5的个数应该是:n/5+n/5/5+n/5/.../5,一直到某个数/5=0 。如对于n=2000,末尾0的个数为:


 5  2000

 5    400

 5      80

 5      16

            3  ... 1  

所有0的个数为 = 2000/5+ 400/5 + 80/5 + 16/5 = 400+80+16+3 = 499

好了,其实简单的程序如下:

int calcZero(int n)
{ 
   int sum = 0;
   while(n / 5) sum+= n/5;
   return sum;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值