先檢視勒讓德定理
5的1次冪5的倍數增加1個0 (5,10,15,20,25,30,.....)
5的2次冪25的倍數增加2個0(必然是5的倍數)(25,50,75,100,125.....)
5的3次冪125的倍數增加3個0(必然是25的倍數)(125,250,375,500.....)
5的4次冪625的倍數增加4個0(必然是125的倍數)(625,1250,1875,2500.....)...........所以先求出5的倍數
加上25的倍數(2個0,其中1個已記入5的倍數)
加上125的倍數(3個0,其中1個已記入5的倍數1個已記入25的倍數)
加上625的倍數(4個0,其中....................................)
1000/5=200 (1000裡面含有200個5的倍數,但同時也包含了25倍數,125的倍數,625的倍數各一次)
1000/25=4
(1000裡面1000/125=8(1000裡面含有8個125的倍數,同時也含有625的倍數)含有40個25的倍數,同時也含有125的倍數,625的倍數各一次)
1000/625=1(1000裡含有1個625的倍數)
1
000!階乘個數(200-40+8-1)+2*(40-8+1)+3*(8-1)+4*(1) = 249
下面為**程式
lg(1000!)=lg(1000*999*......*2*1)=lg(1000)+lg(999)+......+lg(1)
lg(1000!)=lg(1000)+ lg(999)+....+lg(1) (
為保證1000個小數相加不致產生誤差每個數必須精確到0.0001以上,下例程式中故使用
float) x=lg(1000)+ lg(999)+....+lg(1)的整數部分這個就可以用程式實現了
/* lg.c */
求1000的階乘尾部0的個數
要求1000的階乘尾部0的個數,如果想先求出1000的階乘,肯定超過了基本資料型別的取值範圍,此時就需要通過其他途徑來解決問題。biginteger可以接收很大的整數,所以完全可以接收1000的階乘的結果。public static void main string args string str ...
n的階乘末尾有幾個0
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 這個問題很簡單,就是問你n的階乘末尾有幾個0?輸入第一行乙個整數t 1 t 100 代表測試組數 接下來t行,每行乙個數n 1 n 10 9 對於每組測試資料,輸出...
N的階乘中末尾有幾個0
原位址 n的階乘中末尾有幾個0 如果n!k 10m,且k不能被10整除,那麼n!末尾有m個0。再考慮對n!進行質因數分解,n!2 x 3 y 5 z 由於10 2 5,所以m只跟x和z相關,每一對2和5相乘可以得到乙個10,於是m min x,z 不難看出x大於等於z,因為能被2整除的數出現的頻率比...