線性素數篩

2021-08-28 09:13:32 字數 1577 閱讀 4241

兩個星期之前,如果你讓我篩一下素數,我會告訴你很簡單,然後一頓敲

#define size 1000000

int main()

; int pos;

int flag;

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

if (flag == 1)

}printf("%.2f", (double)clock()/clocks_per_sec);

return 0;

}-------

output:5.26

這麼low的演算法我真不好意思拿出來

#define size 1000000

int main()

;//元素值為0代表是素數

int prime[size] = ;

int pos=0;

int flag;

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

}printf("%.2f", (double)clock()/clocks_per_sec);

return 0;

}------

output:0.17

#define size 1000000

int main()

;//元素值為0代表是素數

int prime[size] = ;

int pos=0;

int flag;

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

}printf("%.2f", (double)clock()/clocks_per_sec);

return 0;

}------

output:0.02

從輸出我們可以看到線性篩法速度最快,而第一種就呵呵了。

其實第一種不能算是篩素數,而是判斷乙個數是不是素數。篩素數是為了求得乙個區間內的所有素數,而把不是素數的篩去。

下面對線性篩法和普通篩法進行比較,以便理解線性篩法中的注釋的重要部分。

上個圖,可能更好理解,這是普通篩法每次迴圈分別篩掉的數

可以看到有很多重複篩選的,這裡列出的範圍較小,如果範圍較大的話會更直觀

這裡不好理解,上圖

從圖上我們看到,第一列篩掉的是最小素因子是2的數,第二列篩掉的是最小素因子為3的數,依次類推,可以把所有的合數都篩掉

自己**:

const int maxn=100000007;

int mark[maxn],prime[maxn];

int pri()

}return index;

}

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

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

素數線性篩

ps 證明 神牛部落格。include include using namespace std const int n 100100 int v n p n n,m,tot int main 首先,先明確乙個條件,任何合數都能表示成一系列素數的積。不管 i 是否是素數,都會執行到 關鍵處1 如果 i...

線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。in...