篩法求素數

2021-08-08 05:20:09 字數 882 閱讀 6887

假設要求n以內的素數

篩法求素數是用乙個大小為n的陣列,作為標記陣列,如果沒被標記到則為素數。

開始均為未標記。

從2開始,2沒被標記,將2存入乙個存素數的地方,然後篩掉小於n的,2的所有倍數。然後是3,篩掉3的所有倍數,依此類推,直到n-1。

上面的做法,同乙個數可能會被篩掉多次,比如6會被3和2各篩一次。

為了提高效率,需要進行優化,使得每個數盡可能的被少篩,如果能一次最好。

考慮到任何合數都可以分解成若干個素數的乘積。在篩掉合數的過程中,最好的是讓每個合數只被它最小的因子篩掉。

如24 18 都只被2篩掉

int countprimes(int n) 

}return prime.size();

}

最外層迴圈每次迴圈,都能得到小於等於i的所有素數,當要求i+1內的素數時,只需判斷i+1是否在之前被篩掉。

與此同時,將當前所有素數的i+1倍篩掉。

那後面出現的素數的i+1倍,設為m ,會怎麼樣呢?

優化點:每個數都被它最小的因數篩掉

具體操作:如果迴圈到某個素數 prime[j] 是 i+1的倍數時,後面的素數的i+1倍prime[j+1] * (i+1)就不用篩了。

原因在於:後面素數的i+1倍一定會被 prime[j] (更小的乙個數)篩掉,pr

ime[

j+1]

∗(i+

1)=p

rime

[j+1

]∗pr

ime[

j]∗k

k=(i+1

)/pr

ime[

j]

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

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

素數篩法求素數

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

篩法求素數

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