教科书的示例
其想法很简单,先写一个判断是否是质数的函数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