求素數,判斷素數,篩法

2021-07-27 06:35:51 字數 976 閱讀 1523

1.判斷素數

時間複雜度 o(sqrt(n))

空間複雜度 o(1)

#include#include//sqrt函式標頭檔案

using namespace std;

bool prime(int n)

return 0;

}

不足之處:很多數被處理了不止1遍,比如6,在素數為2的時候處理1次,為3時候又標記一次,因此又造成了比較大的不必要處理.

(2)線性篩法

原理:

每個合數必有乙個最小素因子。每個合數僅被它的最小素因子篩去正好一次。所以為線性時間。那麼合數有兩種:1.素數*素數=合數   2.乙個最小的素數*合數=合數

篩除:如果遇到i為素數,那麼乙個大的素數 i 乘以不大於 i 的素數,這樣篩除的數跟之前的是不會重複的

如果遇到i為合數,我們只認為合數由乙個最小的素數*合數得到,也不會重複(就像12=2*6而不是12=3*4)

時間複雜度:o(n)

空間複雜度:o(2n)

#include#includeusing namespace std;

const int n=1000001;

int prime[n],vis[n],cnt=0; //prime儲存素數,vis儲存是否篩選過

int main()

{ for(int i=2;i

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

prime陣列 中的素數是遞增的,當 i 能整除 prime[j],那麼 i*prime[j+1] 這個合數肯定被 prime[j] 乘以某個數篩掉。

因為i中含有prime[j], prime[j] 比 prime[j+1] 小。接下去的素數同理。所以不用篩下去了。

在滿足i%prme[j]==0這個條件之前以及第一次滿足改條件時,pr[j]必定是pr[j]*i的最小因子。

素數篩法求素數

素數篩類似於打表標記,預先處理掉非素數的數,即素數的倍數 任意非素數都可以由幾個素數相乘得到 於是效率比暴力求解快得多。埃氏篩法的效率為o n loglog n 簡單易懂,但是會重複標記,比如當i為2時,6會被標記掉,然而當i為3時,6又會被重複標記,這樣的重複訪問加大了時間複雜度,於是有了尤拉篩。...

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

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

篩法求素數

素數篩法就是每次把已知的素數的倍數曬去,篩掉前sqrt n 中素數的倍數就可以了 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數...