篩選法統計素數

2021-08-27 16:20:49 字數 967 閱讀 8253

學習到一種高效的篩選素數的方法——埃拉託色尼篩選法,如果要選出[2, n]範圍內的素數,可以參考以下步驟:

1.構造乙個[2, n]範圍的陣列,全部標記為1(true)。

2.刪除掉陣列中的非素數,將其標記為0(false)。

①:刪除2的倍數

②:刪除3的倍數

③:刪除4的倍數(沒有必要,已經在①中刪除了)

④:刪除5的倍數

3.直到不能繼續刪除為止。如此留下的就是質數了。

原理是顯而易見的,沒有必要多做解釋。先上**:

#include#define n 10000

using namespace std;

int main()

} }//輸出

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

if(prime[i] == 1)

cout << i << '\t';

}

先看這部分**:

if(prime[i] == 1)

}

意思是如果i是素數,會去除i * i, i * (i + 1), i * (i + 2), i * (i + 3), ...... , i * (i + m)。(其中i * (i + m) <= n)

那2i, 3i, 4i, ...... i * (i - 1)怎麼辦呢?實際上,我們已經早就把這些數刪掉了。因為我們在去除i的倍數以前,早就已經去除了2, 3, 4, ......, i - 1的倍數。而我們省去的那部分數也正是這些數的倍數,所以就無需再次刪除了。

在理解了這個的基礎上,我們再來看看for迴圈中i * i <= n的條件。實際上就是要求i <= floor(√n)。當i == floor(√n)時,只需要處理i * i( <= n)之後i的倍數即可, 前面的已經被其他數的倍數去除了。此時若i += 1,那麼i實際上刪除的倍數則在n之後,對於題目要求而言就沒什麼必要了。

排序方法統計

1 氣泡排序 相鄰元素之間逐對兩兩比較,若不符合預期則先交換位置再繼續比較,如此,每次比較都能把最大或最小的元素放在預期位置,直到完成排序。氣泡排序 public static int popsort int array else continue return arr 2 快速排序 2 同時從數字...

質數篩選 素數篩選法

int prime 100010 void prime for int i 1 i i 1000000 i define size 1000000 int main 元素值為0代表是素數 int prime size int pos 0 int flag for int i 2 i size i p...

素數篩選法

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