素數與素數篩

2021-10-09 01:18:34 字數 1794 閱讀 6944

素數篩法:

線性篩法

啊,耳熟能詳。素數又稱質數,乙個大於1

11的自然數,除了1

11和它本身外,不能被其他自然數整除,換句話說就是該數除了1

11和它本身以外不再有其他的因數;否則稱為合數。啊!1

11不是素數啊

啊,也耳熟能詳了,暴力列舉一下除1

11和本身的自然數是否會被整除。

bool

is_prime

(int x)

啊,其實可以優化的,也耳熟能詳(我真欠揍),我們只用從2

22到x

\sqrt x

x​就可以了。

從2

22到x

\sqrt x

x​的證明:

很容易發現這樣乙個事實:如果a

aa是x

xx的約數,那麼x

a\frac

ax​也是x

xx的約數。

得證。**:

bool

is_prime

(int x)

啊,其實還有更簡單的判斷方法:mil

ler−

rabi

nmiller-rabin

miller

−rab

in。耳熟能詳個屁,自行學習吧。

1.e ra

tost

hene

seratosthenes

eratos

then

es篩法這era

tost

hene

seratosthenes

eratos

then

es一長串不是人讀的是乙個人的名字:埃拉託斯特尼。啊,耳熟能詳。era

tost

hene

seratosthenes

eratos

then

es篩法的原理非常簡單:乙個素數的倍數一定不是素數。

**:

void

eratosthenes

(int n)

return

;}

過程如下:

正在處理的數

陣列check的情況

22,3,4,5,6,7,8,9,10,11,12…

32,3,4,5,6,7,8,9,10,11,12…

52,3,4,5,6,7,8,9,10,11,12…

72,3,4,5,6,7,8,9,10,11,12…

112,3,4,5,6,7,8,9,10,11,12…

可以發現,2

22和3

33都會把6

66標記為合數。實際上,小於x2的x

xx的倍數在之前就會被標記,所以我們可以優化為:

void

eratosthenes

(int n)

return

;}

時間複雜度為o(n

logl

ogn)

o(n \ log \ log \ n)

o(nlog

logn

),顯而易見。

埃式篩法也會重複標記,乙個數的素數約數越多,重複標記越多。

我就不具體講了,推薦一篇部落格

**:

voidyu(

int n)

}return

;}

啊,簡單。

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

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

素數判定,素數篩

這些零碎的知識點每個都學過n次了,但隔一段時間就會忘,記錄下來 素數定義 只能被自身和1整除的大於1的正整數 通過這個定義,我們就可以得出判斷素數的 這裡用到了cmath中的sqrt函式,其原型為double sqrt double 所以在取上界的時候,為了避免double帶來的精度丟失,寧可多列舉...

又見素數(素數篩法)

又見素數 time limit 2000ms memory limit 65536k total submit 287 accepted 24 description 給定乙個正整數n n 10000000 求n 包含 以內素數的個數。input 第一行為乙個整數t t 1000 表示測試資料的組數...