教科書的示例
其想法很簡單,先寫一個判斷是否是質數的函數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