快速求得一個數字的所有素因子


Efficient program to print all prime factors of a given number

快速求得一個數字的所有素因子

前言

對於求一個數 n 的所有質因子, 通常是在 [2, sqrt(n)] 的范圍內枚舉 i , 看是否能夠整除, 如果可以則輸出 i 以及 n / i.
然而, Vishwas Garg提供了一種更為高效(logN)的求一個數所有素因子的方法.

具體步驟

  1. 除以所有以 2 為倍數的因子
  2. 枚舉以 i 為倍數為因子的整數, 此時 i 肯定不為 2.
  3. 防止 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;
}


免責聲明!

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



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