计算50的阶乘,结果末尾处有多少个0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算50的阶乘,结果末尾处有多少个0相关的知识,希望对你有一定的参考价值。

应有12个0
从50一直乘到1,末尾出现0的个数,取决于乘数中出现0的个数和5的个数,如果乘后末尾数含10则产生1个0,如果乘后末尾数含100则产生2个0,因此需要分析5的倍数。50的阶乘中其中含有10、20、30、40、50和5、15、25、35、45;此外50=5乘10应多产生一个0,例如2乘50得100,多产生一个0;25=5乘5应多产生一个0,例如4乘25得100,多产生一个0。
所以50的阶乘末尾应该有5+5+1+1=12个0
参考技术A 看有几个5的倍数,就是有几个10的倍数。
50/5=10,50/25=2,就是有5的12次方,从而得出,
50的阶乘,结果末尾处有
12
个0

计算n的阶乘有多少个尾随零

思路一:

    计算出n!= nValue,然后 nValue % 10 == 0 则nCount自增1,nValue /= 10 直到条件为否,最后nCount就是我们想要的结果,代码如下:

 1 int CountZero(int n)
 2 {
 3     unsign long long nValue = 1;
 4     for (int i = 2; i <= n; i ++)
 5     {
 6         nValue *=i;
 7     }
 8     int nCount = 0;
 9     while(0 == nValue % 10)
10     {
11         nCount ++;
12         nValue /= 10;        
13     }
14     return nCount;
15 }

代码简洁易懂,看上去还不赖,但是这里要考虑一个问题就是在求n!整数溢出了怎么办?  显然我们使用_int64也同样会有溢出的时候,所以上面的代码实际上是不可行的。

思路二:

    不知道怎么办,不妨先举例分析:

1! = 1
2! = 1 * 2 = 2
3! = 1 * 2 *3 = 6
4! = 1 * 2 * 3 * 4 = 24
5! = 1 * 2 * 3 * 4 * 5 = 120
........
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13
* 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 *23 * 24 * 25

我们会发现一个因子2和因子5组合产生一个0,这样我们只需统计1到n有多少个因子对,即n!的尾随零个数,因子2的个数比因子5的个数多,因此我们只需统计出因子5的个数即可,如

5,10,15,25,30,35,40.......

需要注意的是,以100!为例:

统计一次5的倍数 (5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100)= 20

统计一次25的倍数(因为25的倍数有两个5的因子,所以再统计一次)(25,50,75,100) = 4

统计一次125的倍数(125的倍数由3个5的因子,所以再统计一次,以此类推)(nil)

所以100!的尾随零个数为24个

实现代码如下:

1 int CountZero(int n)
2 {
3     int count = 0;
4     if (n < 0)
5         return -1;
6     for (int i = 5; n / i > 0; i *= 5)
7         count += n / i;
8     return count;
9 }
运行结果:
1 1 0 0
2 2 0 0
3 6 0 0
4 24 0 0
5 120 1 1
6 720 1 1
7 5040 1 1
8 40320 1 1
9 362880 1 1
10 3628800 2 2
11 39916800 2 2
12 479001600 2 2
13 6227020800 2 2
14 87178291200 2 2
15 1307674368000 3 3
16 20922789888000 3 3
17 355687428096000 3 3
18 6402373705728000 3 3
19 121645100408832000 3 3
20 2432902008176640000 4 4
21 14197454024290336768 0 4
22 17196083355034583040 1 4
23 8128291617894825984 0 4
24 10611558092380307456 0 4

当n=21时,21!已经溢出。

以上是关于计算50的阶乘,结果末尾处有多少个0的主要内容,如果未能解决你的问题,请参考以下文章

100的阶乘末尾有多少个零!急求程序!

计算n的阶乘末尾有多少个0

N的阶乘末尾有多少个0

求N的阶乘末尾有几个0

poj1401--Factorial--阶乘末尾0的个数

LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分