正整数n的阶乘中0的个数

 有一天有个同学问我100!后有几个0

刚开始我就想末尾是0或者5就能产生一个0

1~100  有10 20 30 ~100   一共 11 个0

1~100  有5 15 25 35 45 55~ 95  一共有11个5

而25 75能产生2个0    故             2个0

一共24 个0

然后理清自己的思路 发现有一种更好的想法

                                                               0的个数

5!=120 1

10!= 3628800                            2
20!= 2432902008176640000    4
于是得出了如下结论:
 当0 < n < 5时,f(n!) = 0; 
 当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)
程序如下:
  
Code:
  1. #include <iostream>  
  2. using namespace std;  
  3. typedef int INT;  
  4. typedef unsigned int UINT;  
  5. void main( )  
  6. {  
  7.     INT Fac(UINT n);  
  8.     INT n;  
  9.     cin>>n;  
  10.     cout<<Fac(n)<<endl;  
  11. }  
  12. /********************************************* 
  13. Function: // Fac 
  14. Description: // 求n的阶乘0的个数 
  15. Input: // 输入参数n,n是一个正整数 
  16. Output: 无 
  17. Return: // 函数返回一个整数   表示0的个数 
  18. *********************************************/  
  19.   
  20. INT Fac(UINT n)  
  21. {  
  22.     if (0 < n && n < 5)  
  23.     {  
  24.         return 0;          //递归退出条件  
  25.     }  
  26.     else  
  27.     {  
  28.         return (n/5 + Fac(n/5));  
  29.     }  
  30. }  
其实只要把问题想得透彻,一切就OK!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值