hdu1124 Factorial (求解一個數的階乘中出現多少個0)

解決該題要注意一下幾個方面:web

一、任何一個天然數均可分解質因數。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......ide

二、兩數相乘產生0,只會是2和5相乘。又因爲在分解質因數時小的質數的冪次必定不小於大的質數的冪次大,因此a>=c。故解決該題轉化成找出N!中5的冪次。spa

三、如何找出5的冪次呢?舉例說明:N=26,階乘中包含因數五、十、1五、20、25,可知5的冪次爲6。5=5*1,10=5*2,15=5*5,20=5*4,25=5*5,求解時用26/5=5,code

再用5/5=1,再用1/5=0,因此總冪次爲5+1+0=6。爲何能夠這樣求?在N!中數是連續增長的,5也是以其倍數漸進增長,一直增長到不大於N且是5的整數倍的最大整數。orm

這樣一來就能夠用N/5來肯定出現多少個5了。固然,這還不夠。好比26/5=5,與其冪次爲6不符!緣由在於25=5*5,其中含有2個5!因此,又有了緊接着的5/5=1,1/5=0了。blog

如:50!:ci

含有10個5的倍數的數:5,10,,15,20,25,30,35,40,45,50it

含有2個5^2的倍數的數:25,50    {50 / 5 / 5=2}io

50!中一共有12個5相乘,那麼尾零一定有12個event

 

 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
相關文章
相關標籤/搜索