找素數(質數) 線性篩法和埃氏篩法

2021-10-09 10:11:17 字數 945 閱讀 3413

先看這道題

洛谷p1217回文質數

對於這道題,普通的暴力模擬會tle,所以得尋求改進。這裡我學會了兩種方法;

第一種:線性篩法

這種演算法的核心思想就是:任何乙個合數都可以由質數相乘得到

下面就是核心**,吃透了核心**就可以在其中新增點細節,然後就可以拿去解決問題了

//這裡需要開多大的陣列取決自己

bool isprime[

10000];

int prime[

10000];

int b;

//上限

for(

int i=

1;i<=b;i++

)for

(int i=

2;i<=b;i++

)//篩掉非質數

for(

int j=

1;j<=s;j++

)//遍歷prime陣列

}

第二種:埃氏篩法

其核心思想就是:將質數的倍數篩掉。比如對於質數2,2的倍數4、6、8等一定不是質數數;對於質數3後,3的倍數6、9、12等一定不是質數。

其核心**:

bool isprime[

10000];

int prime[

10000];

int b;

//上限

int s=0;

for(

int i=

1;i<=b;i++

)for

(int i=

2;i<=b;i++)}

}

總結:兩種方法各有各的好,使用哪種方法更好具體看題目本身。

素數篩法(埃氏篩,線性篩)

時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...

埃氏篩法和線性篩法求素數

演算法中有一類題,題目中涉及到大量素數的判定,只要範圍確定,素數的個數和素數就已經是固定不變的,那麼我們可以考慮先預處理,把範圍內所有素數篩選出來,那麼篩素數的方法有哪些,下面就兩種演算法的思想和標程進行說明。一 埃氏 eratosthenes 篩素數。原理 基於任意整數x的倍數2x,3x,4x,都...

埃氏篩法 素數篩

埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...