素數篩選法

2021-07-09 22:12:44 字數 850 閱讀 8300

篩選素數法

搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。

第一種是最常規的做法

int main()

if(j > sqrt(i))

cout<這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt(i)就結束的,並不是到i,大家都知道,乙個數的合數的所有因子不會大於這個合數的根號。

第三種就是素數篩選法

int main();

cin>>n;

for(i=2;i<=n;i+=2)

for(i=3;i<=sqrt(n);i+=2) }

for(i=2;i<=n;i++)

{ if(prime[i])

cout<思路是這樣的,比如輸入100以內的素數,先把所有的偶數的陣列值標為0,奇數標為1(因為偶數不是素數。。),再從i=3開始迴圈,每次加乙個倍數,即6,9,12,15,,,全部標為0,因為這些數都不是素數,再接著i=5開始,10,15,20,,,都標記為0,直到sqrt(n)結束迴圈,這裡為什麼要到sqrt(n)結束而不是n呢?因為在sqrt(n)之後的數字實際上都被前面的數遍歷過並且標記過的。所以最後只需要把陣列的值標記為1的輸出來就是素數了。

素數篩選法

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。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...

素數篩選法

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