1.介紹:假設所有待判斷的數字的上限是l,宣告乙個長度為l+1的布林陣列a[l+1]。用這個陣列來表示對應下標的數字是不是素數。起初,將陣列所有成員標記為1,然後按照某種方法將其中的非素數都標記為0即可
2.實現:
(1)首先宣告乙個布林陣列isprime[l+1], 先將isprime[0],isprime[1]置0,再將布林陣列裡所有除了2以外的偶數判斷元素置false,這樣我們判斷的資料就減少了一半。
(2)從i = 3開始,將小於等於l 的每乙個j = i*i的奇數倍的isprime[j]置0;篩去所有素數的倍數,剩餘則為素數。
3.**:
#include
#include
#include
#define maxn 100
int prime[maxn]=;
//素數表
bool is_prime[maxn +1]
=;intsieve
(int n)
prime[0]
=2;for
(index =
3; index <= n; index +=2
)}}return p +1;
}int
main
(int argc,
char
const
*ar**)
printf
("\r\n");
return0;
}
結果:
素數個數:823
571113
1719
有n盞燈,編號為1~n,第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關(這些燈將被關掉),第3 個人按下所有編號為3的倍數的開關(其中關掉的燈將被開啟,開著的燈將被關閉),依此類推。一共有k個人,問最後有哪些燈開著?輸入:n和k,輸出開著的燈編號。k≤n≤1000
輸入 輸入一組資料:n和k
輸出 輸出開著的燈編號
此案例與素數篩選法有些相似,設每個燈一開始的狀態為false,從第i = 0個人開始,直到i < k, 將每個 i 的倍數取反,看每個燈取反多少次即得其最終狀態。
#include
#include
intprintfstate
(int n,
int k)}if
(state)
}printf
("\r\n");
return0;
}int
main
(int argc,
char
const
*ar**)
執行:
請輸入引數:8,4
亮燈編號:145
678
素數判斷與素數篩選法
方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...
素數篩選法
篩選素數法 搞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。...