計算質數的各種算法


教科書的示例

其想法很簡單,先寫一個判斷是否是質數的函數isPrime(),然后從1到n分別調用isPrime()函數來檢查。檢查是否是質數的算法是核心,其簡單的使用從2到n的開根的數作為除數。這樣的算法復雜度幾乎是O(n*log(n)),看上去不錯,但其實很不經濟。

 1 #include<iostream>
 2 using namespace std;  3 
 4 bool isPrime(int nr)  5 {  6     for(int d=2;(d*d)<(nr+1);++d)  7  {  8         if(!(nr%d))  9  { 10             return false; 11  } 12  } 13     return true; 14 } 15 int main(int argc,char *const argv[]) 16 { 17     for(int i=0;i<50;i++) 18  { 19         if(isPrime(i)) 20  { 21             cout <<i<<endl; 22  } 23  } 24     int a; 25     cin>>a; 26 }

“埃氏篩法”求1000以內的素數C++

 

我們知道,我們的算法如果寫成線性算法,也就是O(n),已經算是不錯了,但是最好的是O(Log(n))的算法,這是一個對數級的算法,著名的二分取中(Binary Search)正是O(Log(n))的算法。通常來說,O(Log(n))的算法都是以排除法做為手段的。所以,找質數的算法完全可以采用排除法的方式。如下所示,這種算法的時間復制度為O(n*lglgn),空間復雜度為O(n)

 1 #include<cstdio>
 2 #include<cmath>
 3  
 4 int num[1001] = {0};//合數標記為1,素數和未判斷的數標記為0;
 5 int primeCount = 0;//primeCount為(素數的個數)
 6 int prime[1001];//存儲素數
 7  
 8 void findPrime() {
 9     
10     for (int i = 2; i <= 1000; ++i) {
11         if (!num[i]) {
12             primeCount++;
13             prime[primeCount] = i;
14             for (int j = 2 * i; j <= 1000; j += i) { 
15                 num[j] = 1;
16                 
17             }
18         }
19   }
20 }
21  
22 int main() {
23     findPrime();
24     for (int i = 1; i <=primeCount; ++i) {
25         if (i % 10 == 0) printf("%3d\n", prime[i]);
26         else printf("%3d ", prime[i]);
27     }
28     getchar();
29 }
30     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM