線性篩素數

2021-09-21 17:55:21 字數 1105 閱讀 7185

不超過n

\text

n的質數約有n/ln n

\text

n/ln n

個。(做個記錄)

ln n

=logen

\text=\text_\text

ln n

=loge​

n

埃氏篩選法是將質數的倍數標記,但有合數被標記多次,所以還能優化。

對於每個合數,只通過「最小質因子 * 非自己的最大因數 = 此合數」的途徑刪掉。在列舉到合數c

\text

c前,必會列舉到 「c

\text

c的非自己的最大因數」 m

\text

m,而c

\text

c的最小質因子p

c\text_

pc​必小於等於m

\text

m的最小質因子p

m\text_

pm​,(m

\text

m的因數必是c

\text

c的因數) 。

所以對於每乙個數i

ii,列舉比它的最小質因子還小的質數p

j\text_

pj​,向上標記合數pj∗

i\text_*i

pj​∗

i,那麼每個合數只會被篩一次,達到線性效率。

#include

#include

int p[

100100

],v[

100100

],len=0;

//p存入所有質數,v[i]表示i的最小質因子,同時也有判素數作用

void

primes

(int n)

for(

int j=

1;j<=len && p[j]

<=v[i]

&& p[j]

*i<=n;j++

)//列舉質數

v[i*p[j]

]=p[j]

;//列舉質數要小於最小質因子 ;不超過範圍 }}

intmain()

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

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是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...