Lintcode 2 尾部的零

2021-10-02 14:00:17 字數 873 閱讀 3718

問題描述:

設計乙個演算法,計算出n階乘中尾部零的個數

樣例說明:

樣例 1:

輸入: 11

輸出: 2

樣例解釋:

11! = 39916800, 結尾的0有2個。

樣例 2:

輸入: 5

輸出: 1

樣例解釋:

5! = 120, 結尾的0有1個。

3.**思路:

根據題目要求,輸入的n是乙個長整型的數。

我們想要求階乘尾部零的個數,那麼這時我們就需要乙個計數器num用來儲存我們數到的0的個數

就要知道階乘的性質

因此我們可以分析出每個數字的階乘都是從1開始逐次×每次加一的數得到的:

可能到這裡有的朋友會想定義乙個i,然後++i,相乘的形式來判斷;

我們首先考慮是否可行:

如果說我們採用這個形式計算乙個數字的階乘,如果數字小還好說,但是這裡的數字是個長整型的,肯定會有測試資料為很大的情況,那麼數字自然不能直接計算階乘再模10來數0的個數,否則就有溢位的風險。

那麼再看題目,為什麼問的是0呢?0有什麼性質嗎?

當然我們來考慮一下怎麼能得到末尾為0;

當然是除以5,為什麼呢?

5!=12345末尾有乙個0;

10!=123456789*10末尾有2個0;

同理,我們把n/5,那麼就獲得了多少個0,但是要注意5的次冪,例如5²,5³等,相當於2個5,3個5.

因此我們需要不斷地將n除以5,除以5後如果不能再除5,說明算式中不存在5的次冪。

4.**:

class

solution

return num;}}

;

5.結果

LintCode 2 尾部的零

問題描述設計乙個演算法,計算出n階乘中尾部零的個數 樣例 11 39916800,因此應該返回 2 問題分析按正常的思路看,第一步 把 n 求出。第二步 用得到的這個數取餘10的倍數,從10開始,再到100,再到 n 10 餘數為0,計數器加1,直到餘數不為零結束,返回計數器數值。於是有了如下 cl...

LintCode 2 尾部的零

設計乙個演算法,計算出n階乘中尾部零的個數 您在真實的面試中是否遇到過這個題?yes樣例11 39916800 因此應該返回 2 解題思路 要求n的階乘,就是求1到n這n個數相乘。在這1到n個數當中,只有2和5相乘的結果才會出現0,其中10的倍數也可以看做是2和5相乘的結果,所以,可以在1到n之間看...

LintCode 2 尾部的零

答案 描述 設計乙個演算法,計算出n階乘中尾部零的個數 您在真實的面試中是否遇到過這個題?樣例 11 39916800,因此應該返回 2 挑戰 o logn 的時間複雜度 小結 從最終的 來看,問題是挺簡單的。之所以折騰這麼久都沒有切入要害,直接做到真正的時間複雜度為o logn 的效果,個人覺得是...