篩選法求素數,之前我學到的是這個版本:
這種已經非常不錯的程式是求1~n之間的素數:
#include
using namespace std;
bool a[50000000];
int main()
for(int i=2;i這種方法將會比乙個乙個求快數十倍。
但這種方法在最劣情況下時間複雜度將高達o(n*sqrt(n)) 如果n非常大,也依舊是一大筆時間開銷。
在優化中,很明顯可以看出這種方法中有些合數被篩了不止一遍,有沒有方法可以避免這種情況呢?
答案是肯定的,請看這個程式:
#include
using namespace std;
bool a[10000000];
int b[10000000];
int n;
void prime1()
這個程式無論什麼情況下時間複雜度將被限制在o(n) 在n非常大的情況下自然是比第一種快很多。(在n=1000時,將會快十幾毫秒,但在n=10000時,將會快兩倍)。
這種新的方法同時會擁有許多附加資訊,這些資訊可以幫助我們求尤拉函式。
篩選法求素數
題目 求100以內的所有素數。求素數的演算法常考,篩選法求素數不常見。定義長度為101的int陣列a 101 初始化為1。依次測試1到100的所有數字是否為素數。若i為合數,則a i 0。篩選完畢後,所有非0元素a i 所對應的數字i為素數。include using namespace std i...
篩選法求素數
篩選法求素數 質數 prime number 又稱素數。乙個 大於1的自然數 除了1和它本身外,不能被其他自然數 質數 整除,換句話說就是該數除了1和它本身以外不再有其他的因數 否則稱為合數 一 一般求素數的方法 乙個數n的因子不會超過n,但是如果我們知道數n的乙個因子a後,另乙個因子b b n a...
篩選法求素數
一 素數的定義 對於素數的定義,維基百科上給出如下一段話 素數指在大於1的自然數中,除了1和此整數自身外,無法被其他自然數整除的數。比1大但不是素數的數稱為合數。二 利用電腦程式,很容易就可以得到不太大的素數。以c語言為工具來描述常見的判斷素數的函式 int isprime int n 這個函式並不...