// 素数筛
/* 原理 :
开一个标记数组,全部初始化为 true,0、1不是素数,直接从数组里划掉。
紧跟着在 0、1后面的【最小的素数】是 2。
从2开始,凡是2的倍数、且小于100000的,全部标记为false。
再找2以后的、是【素数】的下一位数,是3
从3开始,凡是3的倍数、且小于100000的,全部标记为false。
再找3以后的、是【素数】的下一位数,是5
从5开始,凡是5的倍数、且小于100000的,全部标记为false。
这样循环,直到开始的位置大于100000,退出循环。
这样,所有标记为TRUE的元素的下标全是素数。
参考:https://blog.youkuaiyun.com/sdutstudent/article/details/53783051
*/
#include <iostream>
using namespace std;
const int maxn = 100000;
int aa[maxn];
int main()
{
int i, j, k;
k = 1000; // 假设题目要找的是 0 ~ k 以内的全部素数
for (i=0;i<maxn;i++) // 1表示是素数,0表示不是素数
aa[i] = 1;
aa[0] = 0;
aa[1] = 0;
for (i=2;i<k+1;i++) // 起始数(2~k)
{
if (aa[i] == 1) // 如果这个起始数是素数,才进行进一步的操作
{
for (j=i+1;j<k+1;j++) // 从 i+1 开始,把凡事 i 的倍数、且小于 k 的数,标记为 0
if (j % i == 0) aa[j] = 0;
}
}
for (i=2;i<k+1;i++)
if (aa[i]==1) cout<<i<<endl;
return 0;
}
素数筛
最新推荐文章于 2024-12-31 21:25:56 发布