素數篩法:
線性篩法
啊,耳熟能詳。素數又稱質數,乙個大於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 表示測試資料的組數...