zoukankan      html  css  js  c++  java
  • 计算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!已经溢出。

  • 相关阅读:
    linux Segmentation faults 段错误详解
    linux cut
    linux sed
    linux tr
    linux ar
    objdump--反汇编查看
    linux中dd命令
    readelf
    登录后,前端做了哪些工作,如何得知已登录?
    正向代理和反向代理?
  • 原文地址:https://www.cnblogs.com/borey/p/5626172.html
Copyright © 2011-2022 走看看