有趣的演算法(一) n階層尾部有幾個0

2022-10-10 17:39:10 字數 1142 閱讀 1623

有趣的演算法(一)——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...