hdu1124 Factorial (求解一个数的阶乘中出现多少个0)

解决该题要注意一下几个方面:

1、任何一个自然数都可分解质因数。N!=1*2*3*4*5*6*...*N=2^a*3^b*5^c*7^d......=(2*5)^c*2^(a-c)*3^b*7^d......=10^c*2^(a-c)*3^b*7^d......

2、两数相乘产生0,只会是2和5相乘。又由于在分解质因数时小的质数的幂次一定不小于大的质数的幂次大,所以a>=c。故解决该题转化成找出N!中5的幂次。

3、如何找出5的幂次呢?举例说明:N=26,阶乘中包含因数5、10、15、20、25,可知5的幂次为6。5=5*1,10=5*2,15=5*5,20=5*4,25=5*5,求解时用26/5=5,

再用5/5=1,再用1/5=0,所以总幂次为5+1+0=6。为什么可以这样求?在N!中数是连续增加的,5也是以其倍数渐进增加,一直增加到不大于N且是5的整数倍的最大整数。

这样一来就可以用N/5来确定出现多少个5了。当然,这还不够。比如26/5=5,与其幂次为6不符!原因在于25=5*5,其中含有2个5!所以,又有了紧接着的5/5=1,1/5=0了。

如:50!:

含有10个5的倍数的数:5,10,,15,20,25,30,35,40,45,50

含有2个5^2的倍数的数:25,50    {50 / 5 / 5=2}

50!中一共有12个5相乘,那么尾零必定有12个

 

 1 #include<stdio.h>
 2 int main()
 3 {
 4     __int64 t,n,i,j,sum;
 5     scanf("%I64d",&t);
 6     while(t--)
 7     {
 8         scanf("%I64d",&n);
 9         sum=0;
10         while(n)
11         {
12             n=n/5;
13             sum+=n;
14         }
15         printf("%I64d\n",sum);
16     }
17     return 0;
18 }
View Code

 

 

 

 

posted @ 2013-07-15 14:33  zlyblog  阅读(401)  评论(0编辑  收藏  举报