nyoj 84阶乘后0的个数

描述

计算n!的十进制表示最后有多少个0

输入
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
每组测试数据占一行,都只有一个整数M(0<=M<=10000000)
输出
输出M的阶乘的十进制表示中最后0的个数
比如5!=120则最后的0的个数为1
样例输入
6
3
60
100
1024
23456
8735373
分析: http://www.cnblogs.com/hansongjiang/archive/2014/05/06.html
0来源于2*5,且将N!中分解后,2的个数大于5的个数所有,0的个数就等于N!中银子5的个数。
f(n!)=1*2*3*4*5*6*7*…(2*5)…(3*5)***(4*5) ….(k*5)* … n
      只考虑5的倍数:其他的必然没有5.
       抽取出来:
5*(1*2*3*k*) (其他的数) 现在已经有k个5了,但是K!中可能含有5,公式为
f(n)=k+f(k!) k=n/5;
k<5,时候,没有0,所以f(n!)=0;k<=4;
递归写法就很简单了。
int fun(int n)
{
if(n<=4) return 0;
else return fun(n/5)+n/5;
 
}
仔细分析后,其实最终就是求N!因子5的个数。
private static int fun2(int n) {
        // TODO Auto-generated method stub
        int count=0;
        for(int i=5;i<=n;i=i+5)
        {
            if(i%5==0)
            {
            int j=i/5;
                count++;
                while(j%5==0)
                {
                    count++;
                    j=j/5;
                    
                    
                }
                
                
                
            }
            
            
            
        }
        return count;
        
    }
 
 
在nyoj 提交之后发现,递归的效果还不错。
 
 
 
image
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2014-05-06 11:32  hansongjiang8  阅读(198)  评论(0编辑  收藏  举报