問題描述
給定引數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的階乘問題解決,實現無限大數的階乘!無限 兩字有點牽強,數字太...