LintCode 尾部的零

尾部的零

設計一個算法,計算出n階乘中尾部零的個數
樣例
11! = 39916800,因此應該返回 2
挑戰
O(logN)的時間複雜度

solutioin: 轉自Factorials and Trailing Zeroes
1.計算 23! 有多少個尾0
23!=1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19×20×21×22×23 (如果我們使用計算器計算23! 有多少個尾0的話,其實比沒有多大的幫助,因爲計算結果會以科學算術的符號表示。)
如果10是一個數的因子的話那麼其尾部肯定會有0。例如10是50,120和1234567890的因子,所以我們需要去計算出10的因子有多少在23! 的展開式中。但是5×2=10 , 我們需要計算出所有2和5的乘積。在上面的因子展開式中,2(2,4,6,8,10,12,14,...) 的倍數要比5(5,10,15,...) 的多很多。因此,我們只需要計算出上面的因子展開式中多少數字能被5整除。
對於1到23中有多少個數字能被5整除? 5,10,15和20。因此23! 的尾零有4個。
code:

class Solution {
 public:
    // param n : description of n
    // return: description of return 
    long long trailingZeros(long long n) {
        long long res = 0;
        do {
            res += n/5;
        } while(n /= 5);
        return res;
    }
};

計算101! 有多少個尾0
在1到101中有多少個數是5的倍數。5,10,15,20,25,...
一種更加簡潔的求法,因爲101÷5=20() ,因爲25=5×5 所以能被25整除的是另外的5的倍數。101÷5=4 (省略小數點)。因此101! 的尾零數爲20+5=25
總結:
1. 獲取計算階乘的這個數, 比如(101! 則取101)
2. 將這個數除以5 ,只取整數部分(以下相同)
3. 除以52(25)
4. 除以53(125)
5. 繼續除以5的更高次冪,直到結果小於1。
6. 將以上所有的除法結果相加,就是尾零數的個數
code

class Solution {
 public:
    // param n : description of n
    // return: description of return 
    long long trailingZeros(long long n) {
        long long count = 0;
        for (long long i = 5; n / i; i *= 5)
            count += n/i;
        return count;
    }
};
發佈了49 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章