计算质数的各种算法

教科书的示例

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

 

转载于:https://www.cnblogs.com/CheeseIce/p/10455956.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值