码迷,mamicode.com
首页 > 其他好文 > 详细

N的阶乘末尾有多少个零?

时间:2015-09-26 23:52:47      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

创联ifLab的招新问答卷上看到这么一题,大意是:

给出一个整数N,求N!(N的阶乘)的末尾有多少个零?

由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了。

 

首先,为什么末尾会有0?因为2*5 = 10,0就这么来了。所以只要求出这N!中有多少个2多少个5相乘就好了,由于2的出现次数肯定是大于5的,所以只要求有多少个5相乘就好了。

因为求的是N的阶乘,而 N! = 1*2*3*....*N

那么:这N个数中能被5整除的个数 = N / 5

比如N = 50 ,能被5整除的有 5 10 15 20 25 30 35 40 45 50 共10个,即50/5=10

但别忘了25和50,他们可拆分成5*5和5*5*2,也就是说能被5^2整除的数会带来2个零(以此类推5的m次方会在末尾带来m个零)。

所以50!末尾有10+2=12个“0”。

 

所以额外还要求出这5的m次方的数的个数,我们可以从5到5*5到5*5*5 ... 慢慢往大的找。

 

那么具体代码如下(借鉴于网络,2L的答案)

 1 int totalzero(int n)
 2 {
 3     int total = 0;
 4     while (n > 5)
 5     {
 6         n = (n - (n % 5)) / 5;
 7         total += n;
 8     }
 9     return total;
10 }

这里的第n次循环相当于求能被5^n整除的数有多少,并把结果相加。

代码的效果相当于

第一次:能被5整除的数 = n / 5

第二次:能被25整除的数 = n / 5 / 5 

第三次.....

第四次.......

虽然每次循环后n的数值变了,但整体效果还是相当于在求能被5^n整除的数有多少。

N的阶乘末尾有多少个零?

标签:

原文地址:http://www.cnblogs.com/makejeffer/p/4841589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!