埃氏筛法(快速筛选n以内素数的个数)

给你一个数n,请问n以内有多少个素数?(n <= 10e7)

一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n以内的素数就略显吃力了.

要是求n以内的素数个数的话,可以用埃式筛选.预处理一下.

先看下面的代码:

 1 /*
 2     |埃式筛法|
 3     |快速筛选素数|
    |15-7-26|
4 */ 5 #include <iostream> 6 #include <cstdio> 7 using namespace std; 8 const int SIZE = 1e7; 9 10 int prime[SIZE]; // 第i个素数 11 bool is_prime[SIZE]; //true表示i是素数 12 13 int slove(int n) 14 { 15 int p = 0; 16 for(int i = 0; i <= n; i++) 17 is_prime[i] = true; //初始化 18 is_prime[0] = is_prime[1] = false; //0,1不是素数 19 for(int i = 2; i <= n; i++) 20 { 21 if(is_prime[i]) //这里比较巧妙, 我只是意会 22 { 23 prime[p++] = i; //计算素数的个数,也记录下了素数 24 for(int j = 2 * i; j <= n; j += i) // 除掉了i的倍数的数字 25 is_prime[j] = false; 26 } 27 } 28 return p; 29 } 30 31 int main() 32 { 33 int n; 34 while(cin >> n) 35 { 36 int res = slove(n); 37 cout << res << endl; 38 for(int i = 0; i < res; i++) 39 cout << prime[i] << endl; 40 } 41 }
23456789101112
23-5-7-9-11-
23-5-7---11-

结合这张表看看,慢慢一次次的都筛选完了..

其中最小的素数是2,将表中所有2的倍数都除去,剩下最小的数是3,不能被更小的数整除,所以是素数.再将表中3的倍数的数除去.以此类推.如果表中最小的数字是m,m就是素数.然后将表中所有m的倍数都除去...然后就可以了= =

话说要是求区间[x,y]内求素数个数的话,只要0~y的素数个数-0~x的素数个数就可以了,然后判断x是否为素数就可以了...

 

转载于:https://www.cnblogs.com/Recoder/p/4678606.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值