阶乘结果中0的个数

阶乘N!的结果中,有多少个0呢?可以分解N!,观察结果如下:

N! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * …… * N

可以发现,我们可以将所有的非素数因子分解为素数因子,那么就可以得到如下的形式:

N! = 2^x * 3^y * 5^z * 7^w ……

可以肯定,2的次数x一定会大于5的次数z。因为从统计上来看,2每间隔一个数至少出现一次,而5需要间隔4个数才会出现一次。同时,产生0的必要条件是出现2*5。那么在2的数量多于5的情况下,5的个数就决定了阶乘结果中0的个数。所以,可以得出,最后的0的个数就是z。

示例程序如下:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 
 5 int CalcZeroNum(int n) {
 6     int num=0;
 7 
 8     for(int i=5;i<=n;i++) {
 9         int k = i;
10         while (k%5==0) {
11             num++;
12             k = k/5;
13         }
14     }
15     return num;
16 }
17 
18 int CalcZeroNumImprove(int n) {
19     int num = 0;
20     while(n/5) {
21         n = n/5;
22         num+=n;
23     }
24     return num;
25 }
26 
27 int main(void)
28 {
29     int n;
30     cout<<"input your number: ";
31     cin>>n;
32     cout<<endl;
33     cout<<"method 1 : "<<CalcZeroNum(n)<<endl;
34     cout<<"method 2 : "<<CalcZeroNumImprove(n)<<endl;
35     return 0;
36 }

几个测试结果:

1 f(5!)    = 1
2 f(10!)   = 2
3 f(20!)   = 4
4 f(100!)  = 24
5 f(1000!) = 249

 

转载于:https://www.cnblogs.com/warnet/p/3904722.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值