階乘尾部的0

2021-10-05 06:57:51 字數 905 閱讀 8653

挑戰:

首先我們不考慮時間複雜的解決思路是先求出 n 的階乘,然後再計算 n 階乘尾部 0 的個數。

**如下:

public

long

trailingzeros

(long n)

//求尾部 0 的個數

while

(arg %

10==0)

++result;

arg /=10;

}return result;

}

時間複雜度為 o(n)。那如何才能使時間複雜度為 o(logn) 呢?

先求階乘,然後再求尾部 0 的個數肯定不行。所以我們必須找出 n 與 n 階乘尾部 0 的個數之間的關係。

我們將 n 階乘中每個數拆成素因子的乘積,發現尾部的 0 是由 2*5 產生的,而 5 的量一定小於 2,因此素因子中 5 的個數決定了尾部 0 的個數,只要求出 n 階乘中素因子 5 的出現次數即可。

11 ! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

= 11 * 2*5 * 3*3 * 2*2*2 * 7 * 2*3 * 5 * 2*2 * 3 * 2 * 1 (其中素因子 5 有 2 個)

= 39916800 (尾部有 2 個 0)

**如下

public

long

trailingzeros

(long n)

return result;

}

原文

階乘尾部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 ...

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 得...