文章
4
粉丝
174
获赞
1
访问
2.3k
埃氏筛法简述:和辗转相除法比较相似。首先将2到n范围内的整数写下来,从2开始依次找到各个素数,然后将这个素数不超过n的倍数划去。反复操作后就能得到n以内的所有素数。
例子:n = 20时
从2开始,第一遍筛掉它的倍数4、6、8、10、12、14、16、18、20,这些数都不是素数,22超过了20,结束本轮筛选。
然后3也是素数,第二遍筛掉它的倍数6、9、12、15、18,这些都不是素数。
第三遍是5,依次类推就可以得到素数表。
然后拿输入的数据来对比一下就好啦!
需要注意的点:
(1)1不是素数。
(2)范围有点特殊,我算了一下有一个数据可能是9974或以上的输入,这个时候应该是10007的输出,如果在使用暴力算法求解时,可能因为循环的右界限是10000导致没算出下一个素数错误而80%,这里要注意一下。
代码如下:
#include<iostream>
const int maxn = 100000; //素数表的个数,一定要比题目所给的10000大,嫌麻烦我直接添了个0
using namespace std;
bool isprime[maxn]; //素数表
void proc(){
for(int i = 0; i <= maxn; i++)
isprime[i] = true;
isprime[0] = isprime[1] = false; //首先明确0和1都是非素数
for(int i = 2; i <= maxn; i++) //从2开始依次筛选
if(isprime[i]) //判断当前数字是否是素数,如果是则筛选倍数,如果不是则继续循环
&...
登录后发布评论
暂无评论,来抢沙发