素數 超強篩選法

2021-05-06 12:38:57 字數 596 閱讀 1432

一般篩選法求素數:用乙個bool 陣列prime[size],篩掉所有的合數,剩下的即為素數。

在這裡向大家介紹一種優化後的「篩選法」。這是我從浙江師範大學acm**上學來的,跟大家分享一下。http://acm.zjnu.cn/show.asp?tab=arithmetic&id=34

優化:

bool 陣列只存奇數(3,5,7,9,11,13.....2*i+3...),這樣篩選量就相對減小了,但這還不是超強之處!篩選過程才強!

易知,每個奇數跟其下標的關係為2*i+3(如3=2*0+3,5=2*1+3);當我們選定3是素數時,它的倍數9,15,21....就要賦為false。

如何在只知道下標的情況下找到它的倍數呢!?!9的下標是3,15的下標是6...都是相差3;5的倍數的下標之間相差5....           15既是3的倍數也是5的倍數,在找到3時已經賦為false了,我們就不必再給它賦值了,但是如何跳過15(下標i==6)直接到25(i==11)去呢!?!......

外圍迴圈為i時,內層迴圈的篩法是從 i+(2*i+3)*(i+1)     即i*(2*i+6)+3開始篩的

。11=1*(2*1+6)+3,由5(i=1)跳到25(i=11)。

素數篩選法

篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...

素數篩選法

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...

素數篩選法

素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?以下 均基於打表 1 1e6 的基礎上完成 素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫 include include define maxn 1000000 10 int pri maxn int isprim...