問題描述:
設計乙個演算法,計算出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 的效果,個人覺得是...