有趣的演算法(一)——n階層尾部有幾個0
最近在網上看到好幾次這個題目,覺得挺有意思,則準備用php進行實現。
1、題目
給乙個非負整數n,確定n!的尾部有幾個0。
2、輸入輸出示例
輸入 1,輸出 0。 輸入6,輸出1。
3、解 1)最常規的方法,會想到先求解n!,再通過除以10取餘數的方式進行。但是此方式求解速度較慢,另外n的值比較大的時候,會產生資料溢位,無法求出n!的值。
**段如下:
if(2>$n)$return 0;
$res= 1;
for($i=2;$i<=$n;$i++)
$zeronum = 0;
while(0 == $n%10)
return $zeronum;
2)由於n! =1*2*3…*n,再分析10=2*5,因此,要確定結尾有幾個0,只需要確定n是由多少個2*5組成就行。
觀察序列1、2…n,發現明顯2的數量遠多於5,例如1-10裡面,2的因子的數量有8個(其中4=2*2,8=2*2*2)而5的因子只有2個。
因此,要求n!的結尾有幾個0,題目就轉換成1,2…n共有幾個5的因子。該方案有3種求解方式。
1)較慢的求解方式,即遍歷1,2..n,把5的因子進行相加
**段如下:
$fivenum = 0;
for($i=1;$i<=n;$i++)
}return $fivenum;
2)稍快的求解方法,分析5的因子的構成,發現5、10、15…等數才有5的因子,因此上述的迴圈可以改成如下形式。
**段如下:
$fivenum = 0;
for($i=5;$i<=n;$i=$i+5)
}return $fivenum;
3)更快的求解方法,再對5、10、15…等數字進行分析,發現凡是5的倍數的都有1個5的因子,25的倍數的都有2個5的因子,125的倍數的都有3個5的因子。
因此,將n/5,求得的結果即為5的倍數的個數;再將n除以5,求得的結果是25的倍數的個數,以此類推求解。
**段如下:
$fivenum = 0;
while(1 <=$n)
return $fivenum;
——written by linhxx 2017.07.12
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整除的數出現的頻率比...
python之N階乘結果末尾有幾個0(演算法)
之前寫過乙個階乘末尾0個數的計算方法,是要把階乘算出來 python之n階乘結果末尾有幾個0 今兒想到若階乘最後為0,則必須有2 5,相當於把每個階乘因子分解並計算2和5的個數 現實中2的個數肯定大於5,所以只需要計算5的個數 對於乙個階乘來說,因子5的個數應該為數字n 5,若為25 125這些為5...