求n的階乘中含有多少個2及其變換問題

在編程中遇到很多Math相關的問題都可以轉換為求n的階乘中含有某個數的個數;
例如這道:

172. Factorial Trailing Zeroes
Given an integer *n*, return the number of trailing zeroes in *n*!.
**Note: **Your solution should be in logarithmic time complexity.

這道題的解題關鍵是:分解因子, 當且僅當 因子中出現 一對 (2,5)時, 最后結果會增加一個 trailing zero.分析可知,因子中出現2的次數要遠大于5,因此,只需要計算出將n!因式分解之后5的個數.
因此,問題就變成了計算n的階乘中含多少個5的問題.

分析一下30!中含有多少個具有5的質因數
第一次:5、10、15、20、25、30 共6個
第二次:1、2、3、4、5、6共一個
第三次:沒有
公式f(x) = f(n) = (n/5) + (n/25) + ...

同理,分析一下8!中含有多少個具有2的質因數
8! 有1 2 3 4 5 6 7 8
第一次 則它有 2 4 6 8四個具有2的質因數
第二次 2 4 6 8變為 1 2 3 4 則只有 2 4具有2的質因數
第三次 2 4 變為 1 2 則只有2 具有2的質因數
公式 f(n) = (n/2) + (n/4) + (n/8) + (n/16) + ...

因此,上題的代碼就可以寫成:

class Solution {
public:
    int trailingZeroes(int n) {//質因數分解,因為最終尾部0的個數由質因子中2和5的個數決定,min(2,5),而5的個數遠小于2,因此只需要求出5個數
        int ret = 0;
        while(n)
        {
            ret += n/5;
            n /= 5;
        }
        return ret;
    }
};

此外,求N!的二進制表示中最低位1的位置也可以轉化為求N!中質因子2的個數;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容