N的階乘中末尾有幾個0

2022-04-06 11:56:57 字數 1647 閱讀 5718

原位址

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整除的數出現的頻率比能被5整除的數高得多,所以把公式簡化為m = z。

int count(int k)

return sum;

}int main()

{ int n,i,j,x,k;

scanf("%d",&n);

for(i=0;i= 5時,f(n!) = k + f(k!), 其中 k = n / 5(取整)。 

顯然,對於階乘這個大數,我們不可能將其結果計算出來,再統計其末尾所含有的「0」的個數。所以必須從其數字特徵進行分析。下面我們從因式分解的角度切入分析。 

我們先考慮一般的情形。對於任意乙個正整數,若對其進行因式分解,那麼其末尾的「0」必可以分解為2*5。在這裡,每乙個「0」必然和乙個因子「5」相對應。但請注意,乙個數的因式分解中因子「5」不一定對應著乙個「0」,因為還需要乙個因子「2」,才能實現其一一對應。 

我們再回到原先的問題。這裡先給出乙個結論: 

結論1: 對於n的階乘n!,其因式分解中,如果存在乙個因子「5」,那麼它必然對應著n!末尾的乙個「0」。 

下面對這個結論進行證明: 

(1)當n < 5時, 結論顯然成立。 

(2)當n >= 5時,令n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是乙個不含因子「5」的整數。 

對於序列5k, 5(k-1), ..., 10, 5中每乙個數5i(1 <= i <= k),都含有因子「5」,並且在區間(5(i-1),5i)(1 <= i <= k)內存在偶數,也就是說,a中存在乙個因子「2」與5i相對應。即,這裡的k個因子「5」與n!末尾的k個「0」一一對應。 

我們進一步把n!表示為:n!= 5^k * k! * a(公式1),其中5^k表示5的k次方。很容易利用(1)和迭代法,得出結論1。 

上面證明了n的階乘n!末尾的「0」與n!的因式分解中的因子「5」是一一對應的。也就是說,計算n的階乘n!末尾的「0」的個數,可以轉換為計算其因式分解中「5」的個數。 

令f(x)表示正整數x末尾所含有的「0」的個數, g(x)表示正整數x的因式分解中因子「5」的個數,則利用上面的的結論1和公式1有: 

f(n!) = g(n!) = g(5^k * k! * a) = k + g(k!) = k + f(k!) 

所以,最終的計算公式為: 

當0 < n < 5時,f(n!) = 0; 

當n >= 5時,f(n!) = k + f(k!), 其中 k = n / 5(取整)。 

f(5!) = 1 + f(1!) = 1 

f(10!) = 2 + f(2!) = 2 

f(20!) = 4 + f(4!) = 4 

f(100!) = 20 + f(20!) = 20 + 4 + f(4!) = 24 

f(1000!) = 200 + f(200!) = 200 + 40 + f(40!) = 240 + 8 + f(8!) = 248 + 1 + f(1) =249 

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 中質數2和質數5的個數,由於能被2整除的數的個數比能被5整除的數多的多,因為只需求出質數5的個數。利用z z 5 z 25 z 125 其中 z 5 表示 z的數中含有質數5的個數。includeusing namespace std intmain cout system paus...

python之N階乘結果末尾有幾個0(演算法)

之前寫過乙個階乘末尾0個數的計算方法,是要把階乘算出來 python之n階乘結果末尾有幾個0 今兒想到若階乘最後為0,則必須有2 5,相當於把每個階乘因子分解並計算2和5的個數 現實中2的個數肯定大於5,所以只需要計算5的個數 對於乙個階乘來說,因子5的個數應該為數字n 5,若為25 125這些為5...