整數的因子分解和質因子分解


整數因子分解

復雜度為\(O(sqrt(n))\)的方法,從1逐個數字判斷即可,如果能夠整除該數\(i\),將\(i\)\(n/i\)同時加入分解結果列表中去。需要注意去重,也就是避免\(i==n/i\)這種情況。java代碼如下:

public List<Integer> factorDecode(int n) {
    List<Integer> list = new ArrayList<>();
    for(int i = 1; i * i <= n; i++) {
        if(n % i == 0) {
            if(i * i != n) {
                list.add(i);
                list.add(n/i);
            }
            else list.add(i);
        }
    }
    return list;
}

整數的質因子分解

整數的質因子分解是指,對於任何大於等於2的正整數\(n\),都有以下公式成立:

\[n = \prod_{i=1}^kp_i, p_i是素數 \]

也就是需要將n分解成質因數的連乘積。因為這樣的分解一定存在,並且如果將這些質因數從小到大排列,那么這樣的分解就是唯一的。假設上面的\(p_i\)已經排過序了,那么我們稍微改寫一下公式,就能得到朴素的解法。

\[n/p1 = \prod_{i=2}^kp_i,pi是素數 \]

顯然這是一個遞歸定義的過程,可以使用遞歸解法,也可以使用迭代解法,下面給出迭代解法的java代碼:

public List<Integer> primeFactorDecode(int n) {
    int i = 2;
    List<Integer> ans = new ArrayList<>();
    while(n > 1) {
        while(n % i == 0) {
            ans.add(i);
            n /= i;
        }
        i++;
    }
    return ans;
}    

基於以上兩種分解的一些變形題目

基於上面的兩種整數分解方法,一些題目會在此基礎稍微變形,但本質上還是進行這兩種分解。比如,有的題目給出一個定義,定義n因子數,如4因子數,也就是當一個整數恰好有4個因子時,就是一個4因子數,給定一個數組,求出數組中有多少個這樣的4因子數。直接按照定義遍歷即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM