素數表的獲取:
素數篩法:
注意事項:
素數又稱為質數,是指除了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...