學習到一種高效的篩選素數的方法——埃拉託色尼篩選法,如果要選出[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...