zoukankan      html  css  js  c++  java
  • 阶乘结果中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
  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/warnet/p/3904722.html
Copyright © 2011-2022 走看看