一.思路
此筛选法用于计算n以下的质数
1.初始化一个2~n的连续整数数列;
2.从2开始循环遍历(如果为0则跳过)假设为x;
3.x与后面的数y进行循环遍历取模(如果为0则跳过);
4.如果取模为0就将y设置为0;(此环节设置为0也是为了2和3环节的跳过,以节省时间和空间)
其中有个问题,就是要循环到几次就可以将质数筛选出来呢,我进行试验发现(x-1)x ,包括(x-1)之前被消除过了。因为x是循环++而来,所以x*x就是判断结束的依据,x*x 要小于等于n;
二.实现
#include <iostream>
using namespace std;
#include <vector> //读取vector头文件
int main(int argc, const char * argv[]) {
//读入数组
int n;
cout << "请输入你要求的数" << endl;
cin >>n;
//设置一个向量数组
vector<int>a;
//初始化数组并显示
for(int i = 2; i <= n; i++)
{
//在容器尾巴加入
a.push_back(i);
cout << i << "\t";
}
//换行
cout << endl;
//筛选出质数
for(int i = 2; i*i <= n; i++)
{
//被消除过的跳过
if(a[i-2]==0)
{
continue;
}
//与后面的数取模比较
for(int j = i+1;j <= n; j++)
{
//被消除过的跳过
if(a[i-2]==0)
{
continue;
}
//进行比较
if(j % i == 0)
{
//将消除的做个标记设置为0
a[j-2] = 0;
}
}
}
//循环打印
for(int c : a)
{
cout << c << "\t";
}
cout << endl;
return 0;
}
这样我们的质数就被提取出来了;设为0的都是被消除的。
这个算法涉及STL,如果读者未学到可以使用new、自定义函数判断、使用有序线性结构即可。