1. 程式人生 > >【算法】素數專題

【算法】素數專題

rim eve style log back rime logs als class

【素數判定】

假設輸入的都是正數,時間復雜度O(sqrt(n))

bool is_prime(int n){
    for(int i = 2;i*i <= n; i++){
        if(n % i == 0) return false;
    }
    return n != 1;
} 

【因數枚舉】

時間復雜度O(sqrt(n)).

vector<int> divisor(int n){
    vector<int> res;
    for(int i = 1;i*i <= n; i++){
        if(n % i == 0
){ res.push_back(i); if(i != n/i) res.push_back(n / i); } } }

【質因數分解】

時間復雜度O(sqrt(n)).

map<int, int> prime_factor(int n){
    map<int, int> res;
    for(int i = 2;i * i <= n; i++){
        while(n % i == 0){
            ++res[i];
            n /= i;
        }
    }
    
if(n != 1) res[n] = 1; return res; }

【n以內的素數】

埃氏篩法,時間復雜度O(log(log(n))),近似於O(n)。

//求n以內的素數 
const int n = 10000;   
int prime[n];    //素數數組,prime[i]表示第i個素數 
bool is_prime[n+1];     //is_prime[i]為true表示i是素數

//返回n以內素數的個數 
int sieve(int n){
    int p = 0;
    for(int i = 0;i <= n; i++) is_prime[i] = true;
    is_prime[
0] = is_prime[1] = false; for(int i = 2;i <= n; i++){ if(is_prime[i]){ prime[p++] = i; for(int j = 2*i; j <= n; j += i) is_prime[j] = false; } } return p; }

【算法】素數專題