6-1 筛法求质数 (15 分)
本题要求使用筛法求出1~N以内的质数。
函数接口定义:
vector sieve(int n); //函数声明, 求n以内的质数
求n以内的质数。其中 n是传入的参数。n 的值不超过10 000 000的范围; 求出的质数存入容器vector并返回。
裁判测试程序样例:
#include
#include
using namespace std;
vector sieve(int n); //函数声明,求n以内的质数
int main(int argc, char const *argv[])
{
int n;
cin >> n;
vector<int> ans = sieve(n);
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++) {
cout << ans[i];
if (i < ans.size() - 1)cout << " ";
}
cout << endl;
return 0;
}
/* 请在这里填写答案 */
输入样例:
输入在一行中给出一个正整数N,其值不超过10 000 000。
10
输出样例:
输出首先在一行中输出指定范围内的质数个数,然后在另一行输出指定范围内的所有质数,以空格分隔,但是最后一个质数后面没有多余空格。
4
2 3 5 7
int a[10000002]= {0};
vector<int> sieve(int n) {
vector<int> temp;
int i,j;
for( i=2; i*i<=n; i++) {
if(a[i]==1)
continue;
int tp=2;
while(tp*i<=n) {
a[tp*i]=1;
tp++;
}
}
for(int i=2;i<=n;i++){
if(a[i]!=1)
temp.push_back(i);
}
return temp;
}
筛选法:
已知除去每个数的倍数,留下来的就是素数;
优化方法:
1.跳过已被删除的数;
2.在i×i的范围内取值;