演算法筆記之素數判定與素數表

2021-10-18 16:30:58 字數 2138 閱讀 8060

素數表的獲取:

素數篩法:

注意事項:

素數又稱為質數,是指除了1和本身之外,不能被其他數整除的數。對給定的正整數n,如果對任意的正整數a(1當n未接近到int型別範圍上界時,素數判定**如下:

bool

isprime

(int n)

return

true

;}

當n接近int型別範圍上界時會導致i*i溢位,解決方法:將i定義為long long型或使用sqrt()判定,判定n能否被2, 3,…, lsqrt(n)」中的乙個整除(其中 lx」表示對x向下取整),即可判定n是否為素數。該演算法的複雜度為o(sqrt(n))

bool

isprime

(int n)

return

true

;}

從1~n列舉,判斷每個數是否是素數,如果是素數就加入素數表。列舉部分的複雜度是o(n),判斷素數的複雜度是0(√n),總複雜度是0(n√n)。這個複雜度要求n不能超過10^5

1~n列舉(非篩法)**實現:

#define maxn 101  

//表長

int prime[maxn]

,ans=0;

//prime存放素數,ans為素數個數

bool p[maxn]=;

void

findprime()

}}

素數表的獲取(1~n列舉非篩法)應用舉栗?:

求解輸出100以內的所有素數。

c++**如下:

#include

#include

#include

using

namespace std;

int prime[

101]

,ans=0;

bool p[

101]=;

bool

isprime

(int n)

return

true;}

void

findprime()

}}intmain()

return0;

}

當n超過10^5時,此演算法也就不在適用。因此迎來了素數篩法的高光時刻!!!時間複雜度為o(nloglogn)。從小到大列舉所有數,對每乙個素數, 篩去它的所有倍數,剩下的就都是素數了。從小到大到達某個數a時,如果a沒有被前面步驟的數篩去,則a一定是素數。因為如果a不是素數,則a一定有小於a的素因子,這樣在之前的步驟篩選中a一定會被篩掉,因此如果當列舉到a時還沒有被篩掉,則a是素數。「篩」的實現,可以借助乙個個bool型陣列p來進行標記,如果a被篩掉,那麼p[a]為true;否則p[a]為 false。

素數篩法**實現:

#define maxn 101  

//表長

int prime[maxn]

,ans=0;

//prime存放素數,ans為素數個數

bool p[maxn]=;

void

findprime()}}}

素數表的獲取(素數篩法)應用舉栗?:

求解輸出100以內的所有素數。

c++**如下:

#include

#include

#include

using

namespace std;

int prime[

101]

,ans=0;

bool p[

101]=;

void

findprime()

}}}int

main()

return0;

}

①1不是素數。

②素數表長至少要比n大1。

③main函式中要記得呼叫findprime(),否則不會出結果。

演算法雜項 快速判定素數 素數表

問題描述,如何快速判斷乙個數x是否為素數?傳統思維 對於數n,從i 2,3,4,5 到 n 1 判斷 n能否被i整除,如果全部不能整除,則n是素數,只要有乙個能除盡,則n不是素數 事實上,為了壓縮迴圈次數,可將判斷範圍從2 n 1改為2 sqrt n 但是我們如果要列印乙個比較大的素數表呢?比如列印...

素數判定演算法

1.素數判定問題 素數判定問題是乙個非常常見的問題,本文介紹了常用的幾種判定方法。2.原始演算法 素數的定義是,除了能被1和它本身整除而不能被其他任何數整除的數。根據素數定義 只需要用2到n 1去除n,如果都除不盡,則n是素數,否則,只要其中有乙個數能整除則n不是素數。bool is primer1...

素數判定 Miller Rabin 演算法

談到素數判定,首先想到的兩種便是暴力判定與篩法,實現非常簡單,在此不提。但在分解大質數時,由於數字過大,使得暴力判定會超時,篩法會超空間 可使用有技巧的限制空間篩法,但數字過大仍然過不了 這時,我們就要引入非完美大質數判定演算法 miller rabin演算法。下面一段引自sunshine cfbs...