求素數的篩法

2021-10-12 10:14:42 字數 712 閱讀 8621

今天我們來介紹兩個求素數的篩法。

1.常規方法:硬演算法

#includeint n,a[1000000];

void sushu(int n)

int main()

優化過後計算量減少了很多,10000以內的素數只計算了500000次,但面對1000000這樣的大數字時依舊很吃力,要41.18s,依舊會超時。

我們換乙個思想,其實每乙個非素數的含義是它可以被某個數整除,也就是說它是某個數的倍數。

3.埃氏篩

#include#includeint n,a[1000000];

void sushu(int n)

}}int main()

這次1000000以內的素數只用了11.63s,顯然比原來的方法快上了不少,但是任然有問題,例如210會被2,3,5,7四個數篩,也就是說依舊有不足的地方。

4.尤拉篩:

#include#includeint n,a[10000000];

int b[10000000];

void sushu(int n){

int i,j,k=0;

for(i=2;i<=n;i++){

if(a[i]==0) b[k++]=i;

for(j=0;j尤拉篩保證了每個數隻被自己最小的因數篩去,複雜度大大減少,計算1000000所用時為9.606s。

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

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後面第乙個沒劃去的數...