素數篩選法與點燈案例

2021-10-09 21:02:32 字數 1417 閱讀 8631

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。...