计算质数的各种算法

教科书的示例

其想法很简单,先写一个判断是否是质数的函数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     
原文地址:https://www.cnblogs.com/CheeseIce/p/10455956.html