文章

4

粉丝

174

获赞

0

访问

843

头像
判断素数 题解:关于埃氏筛选预处理打表的方法求解
P1013 贵州大学机试题
发布于2024年3月13日 16:24
阅读数 196

埃氏筛法简述:和辗转相除法比较相似。首先将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])      //判断当前数字是否是素数,如果是则筛选倍数,如果不是则继续循环
    &...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发