令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main() {
int beg,end;
cin >> beg>>end;
vector<int> vec;
//2是第1个质数,奇数不可能是2的倍数
vec.push_back(3);
int a = 5, num = 2;
while (num <= end) {
bool mark = true;
int size = vec.size();
int j = sqrt(a)+1;
for (int i = 0;i<size&&vec[i]<j;++i)
if (a%vec[i] == 0) {
mark = false;
break;
}
if (mark == true) {
++num;
vec.push_back(a);
}
a += 2;
}
vector<int>::iterator iter1;
if (beg == 1) {
iter1 = vec.begin();
cout << "2";
}
else {
iter1 = vec.begin() + (beg - 2);
cout << *iter1;
++iter1;
}
auto iter2 = iter1 + (end - beg);
num = 1;
while (iter1!=iter2) {
if (num == 10) {
num = 0;
cout << endl;
cout << *iter1;
}
else
cout << " " << *iter1;
++iter1;++num;
}
return 0;
}
注意第1个质数为2。
在判断1个数是否为质数时,只需要判断到不大于其开根号的部分。(后面的部分是重复的)关于sqrt函数(定义在math.h)的实现可以参考这篇博客:这里写链接内容
速度远快于判断每个vec元素的平方后比大小