整數因子分解
復雜度為\(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因子數。直接按照定義遍歷即可。