素數之篩法

2022-03-15 18:58:09 字數 1890 閱讀 4519

本文主要介紹總結一下判定素數過程中使用的兩種篩選方法——eratosthenes篩法(sieve of eratosthenes)和eular篩法(sieve of euler)。

對,我是來騙訪問量的!o(∩_∩)o~~

素數的倍數一定不是素數

i23

4567

891011

1213

1415

1617

1819200

0000

0000

0000

0000

0002

1111

1111

1311

1115

1117

1all00

1010

1110

1011

1010

1

0: 素數

1:非素數

#include using namespace std;

int main()

; int prime[1000];

int count = 0;

for(int i = 2; i < num; ++i)

cout << "the number is: " << count << endl;

}

此演算法的時間複雜度是o(nloglogn),空間複雜度是o(n);

由上也可以看出,此演算法有很多不足之處,比如6,在素數為2時處理過一次,在為3的時候也處理了一次,重複了相同的操作。下面我們將介紹乙個改進演算法,尤拉篩法。

規定每個合數只用最小的乙個質因數去篩選,比如6有2和3兩個因數,只用2進行篩選和置位操作,3的情況通過條件跳過。

i

jp[j]

count23

4567

891011

1213

1415

1617

1819200

0000

0000

0000

0000

0000

0020

2113

0221

3132

1402

2150

2315

1331

6023

1702

4180

2419

0241

10024

1all00

1010

1110

1011

1010

1

0: 素數

1:非素數

下面直接上**

#include using namespace std;

#define length 1000000

int main()

; int prime[1000];

int count = 0;

for(int i = 2; i <= num; ++i)

for(int j = 1; j <= count; ++j)

}cout << count << endl;

}

核心**if(i % prime[j] == 0) break;

eular演算法的時間複雜度為o(n),相較之eratosthenes演算法有了很大的提公升。

github:

個人部落格:

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

演算法之素數篩法

1 方法一 判斷是否是乙個素數 int isprime int a 計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數 2 方法二 判斷是否是乙個素數 mark 標記陣列 index 素數個數 int prime else return...

篩法求素數 線性篩法求素數

2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...