素數篩選法

2021-08-25 17:13:05 字數 765 閱讀 1024

素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?

(以下**均基於打表(1~1e6)的基礎上完成)

素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫:

#include#include#define maxn 1000000+10

int pri[maxn];

int isprime(int n)

int main()

} }}int main()

這種演算法的複雜度應該為o(n);,是一種非常快速的判斷素數的演算法。

上述**有兩處優化,第一處優化的證明如下:

假設 maxn > i > sqrt(maxn)並且為合數,那麼,他肯定會有乙個因子小於等於sqrt(maxn),因此,i一定在之前已經被標記過了。

第二處優化證明為:

假設i>2,那麼對於 i * ( i - 1 ):

如果 i - 1是素數,那麼 i * ( i - 1 ) 一定在之前已經被標記過;

否則,如果 i - 1 是合數,那麼  i - 1能被分成更小的素數。設其中乙個為a,那麼 i * ( i - 1 )= i * ( i - 1 ) / a * a 也一定被標記過。

優化後的演算法時間會節省非常多,在平常的演算法競賽中,用上述**就已經可以解決大部分的涉及素數打表的問題。

素數篩選法

篩選素數法 搞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。...

素數篩選法

基本思想 素數的倍數一定不是素數 實現方法 用乙個長度為n 1的陣列儲存資訊 0表示素數,1表示非素數 先假設所有的數都是素數 初始化為0 從第乙個素數2開始,把2的倍數都標記為非素數 置為1 一直到大於n 然後進行下一趟,找到2後面的下乙個素數3,進行同樣的處理,直到最後,陣列中依然為0的數即為素...