NYOJ 84 阶乘的0

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     int t,n,i;
 6     scanf("%d",&t);
 7     while(t--)
 8     {   
 9         i=0;
10         scanf("%d",&n);
11         while(n)
12         {
13             n/=5;  //看有多少个5的因子,就有多少个0,具体看知识补充
14             i+=n; 
15         }
16         printf("%d\n",i);
17     }
18     //system("pause");
19     return 0;
20 }
21         

 

知识补充:

1:程序通过找出1~100之间的所有整数中包含5这个因子的个数来求解。如100=5*5*4含5的因子个数为2,在求阶乘的过程中末尾产生两个0。 

    这个问题其实很简单,就是数5因子的个数(隐含2忽略)

   如果用循环挨个判断能不能被5和5的幂整除对于较大数效率很底,我们可以对5整除来求,比如

   100!我们用100/5=20,知道有20个含5因子的数,但是还有25,50,这些含2个,数字再大可能

   ,3,4或100个等更多,很简单,既然是5的幂,我们就一直除到商为0.为止,20/5=4,所以100!有20+4=24个0

2:阶乘末尾有多少个0

  分析发现,实际上形成末尾0,就是因子5的数量,而计算1~n之间包含一个因子i的个数的简单算法就是:

  cnt = 0; while (n) { n /= i; cnt += n; }

  因此,直接将i换成5,就可以得到因子5的数量,也即n!末尾0的数量。

3:令f(x)表示正整数x末尾所含有的“0”的个数,则有: 
    当0 < n < 5时,f(n!) = 0; 
    当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

posted on 2012-08-09 08:51  mycapple  阅读(471)  评论(0编辑  收藏  举报

导航