教科书的示例
其想法很简单,先写一个判断是否是质数的函数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 ", prime[i]); 26 else printf("%3d ", prime[i]); 27 } 28 getchar(); 29 } 30