計算階乘n 末尾所含的0的個數

2021-06-28 20:06:25 字數 1009 閱讀 2686

問題描述

給定引數n(n為正整數),請計算n的階乘n!末尾所含有「0」的個數。

例如,5!=120,其末尾所含有的「0」的個數為1;10!= 3628800,其末尾所含有的「0」的個數為2;20!= 2432902008176640000,其末尾所含有的「0」的個數為4。

問題分析:

顯然,對於階乘增長速度的非常快的,很容易就溢位了。當然就不可能把階乘算出來,而是要找規律解決。下面用因式分解的思路來考慮:末尾的0可以分解為2*5,乙個5,乙個2就對應乙個0;

下面給出遞推過程:

(1)當n<5 時,f(n) =0; 結論成立

(2)當n>=5 時,可以令 n!=[5k*5(k-1)…10*5]*a ,其中n=5k+r ,r(0<=r<5),a是乙個不含因子的整數,可看出是乙個滿足條件的整數;

對於序列5k,5(k-1)…10*5 中在每乙個5i中,在區間(5(i-1),5i)內存在乙個偶數,即存在乙個2與之對應。因此這裡的k個『5』因子 與n!中的末尾0個數是一一對應的。

所以遞推公式轉化為:

f(n!)=g(5^k * k! *a) = k + g(k!)= k+f(k!); k!是係數的相乘結果。

f(n!)=k+f(k!);

例如: f(5!)= 1+f(1!)=1;

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

下面給出c++兩種實現**:.遞迴;非遞迴:

//遞迴

int n_jie_tail_zeors_recurise(int n)

return zeros_num + n_jie_tail_zeors_recurise(zeros_num);

}

//非遞迴

int n_jie_tail_zeros_non_recurse(int n)

temp = index;

}return zeros_num;

}

N階乘末尾0的個數

輸入乙個正整數n,求n 即階乘 末尾有多少個0?比如 n 10 n 3628800,所以答案為2 輸入為一行,n 1 n 1000 輸出乙個整數,即題目所求要判斷末尾有幾個0就是判斷可以整除幾次10。10的因子有5和2,而在0 9之間5的倍數只有乙個,2的倍數相對較多,所以本題也就轉換成了求n階乘中...

n的階乘末尾含0的個數

本博主曾被問過這樣乙個問題 求n的階乘中末尾含有多少個0。例如n 10,n 3628800,那麼n 末尾有兩個0。直接計算n 的值顯然不合適,因為n 數值太大,很容易溢位。而且這種無腦的計算方式,顯然不適合面試的時候裝nbility拿高薪offer。本博主當時被問這個問題的時候的第一反應就是 要相乘...

n的階乘問題 階乘位數 階乘末尾0的個數

初來乍到,望高手指教!原有解決n的階乘的方式 迭代,如果是大資料的話,迭代會吃掉大量記憶體,導致記憶體溢位 用平時的迭代解決n的階乘問題 在計算21的階乘時,結果已然為負數,超出整型資料表示範圍。計算34的階乘是,結果已然為0 此段 將n的階乘問題解決,實現無限大數的階乘!無限 兩字有點牽強,數字太...