對任意輸入的正整數n,編寫c程式求n!的尾部連續0的個數,並指出計算複雜度。如:18!=6402373705728000,尾部連續0的個數是3。
(不用考慮數值超出計算機整數界限的問題)
1、直接計算n!的值,然後統計尾部0的個數,時間複雜度o(n);
2、發散思維,想想尾部為0的數是怎麼得到的?
很容易想到2*5即可得到0,則n!可以表示為k*(2^m)*(5^n),由於在n!中m>>n,因此n!=k'*(2*5)^n,即n為尾部為0的個數。
由此,我們只要考慮n!中包含多少個5的倍數就可以了,如25,含有5,10,15,20,25,包含6個5的倍數,即25!尾部有6個0。
n=n/5+n/(5^2)+n/(5^3)....+n/(5^k) (k<=n/5)
時間複雜度:o(log5n)
#include using namespace std;
long long numofzero(long long n)
return count;
}long long factorial(long long n)
return fac;
*/}int main()
N階乘尾部的0個數
描述 設計乙個演算法,計算出n階乘中尾部零的個數 思路 1 1 2 3 n 1 2 3 2 2 5 2 3 7 2 2 2 3 3 2 5 化成質數相乘,只有2 5才可能得到結果有尾數中有0 2 因為2的個數是比5多的,求0的個數問題就轉化成了求5的個數的問題 3 5 5 5 5 5 5有n個5 得...
階乘尾部0的個數
輸入 輸入資料有若干行,每行上有乙個非負整數n,對應一種情形。輸出 對於每一種情形,直接輸出結果 換行。樣例輸入816 30樣例輸出13 7方法一 令f x 表示正整數x末尾所含有的 0 的個數,則有 當0 n 5時,f n 0 當n 5時,f n k f k 其中 k n 5。include in...
求1000的階乘尾部0的個數
要求1000的階乘尾部0的個數,如果想先求出1000的階乘,肯定超過了基本資料型別的取值範圍,此時就需要通過其他途徑來解決問題。biginteger可以接收很大的整數,所以完全可以接收1000的階乘的結果。public static void main string args string str ...