Efficient program to print all prime factors of a given number
快速求得一個數字的所有素因子
前言
對於求一個數 n 的所有質因子, 通常是在 [2, sqrt(n)] 的范圍內枚舉 i , 看是否能夠整除, 如果可以則輸出 i 以及 n / i.
然而, Vishwas Garg提供了一種更為高效(logN)的求一個數所有素因子的方法.
具體步驟
- 除以所有以 2 為倍數的因子
- 枚舉以 i 為倍數為因子的整數, 此時 i 肯定不為 2.
- 防止 n 為一個大的素數
代碼實現
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
void primeFactor(int n){
// 除去所有 2 的倍數的因子
while(n % 2 == 0){
printf("2 ");
n /= 2;
}
// 經過第二步, 此時 n 一定為奇數
// 並且不存在偶數的素因子
// 所以我們可以跳過所有偶數 (i += 2)
for(int i = 3; i <= sqrt(n); i += 2){
//除去所有 i 的倍數的因子
while(n % i == 0){
printf("%d ", i);
n /= i;
}
}
//此處為了防止是一個大於 2 的素數
if(n > 2)
printf("%d ", n);
}
int main(){
int n;
scanf("%d", &n);
primeFactor(n);
return 0;
}