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(取整)。