题目
令Pi表示第 i i i 个素数。现任给两个正整数 M < = N < = 1 0 4 M <= N <= 10^4 M<=N<=104,请输出PM到PN的所有素数。
输入格式
输入在一行中给出M和N,其间以空格分隔。
输出格式
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例
5 27
输出样例
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
分析
因为题目中给定的范围也不是很大,所以我开了一个30w大小的数组,用来存储所有的素数,然后再输出要求范围内的素数。输出时要加一个计数器,当计数器%10==0时,换行。
代码
#include <iostream>
using namespace std;
int num[300000], k = 3;
int m, n;
int main(){
cin>>m>>n;
num[0] = 2;
num[1] = 3;
num[2] = 5;
num[3] = 7;
for(int a = 8; a <= 13000; a++){
int flag = 0;
for(int i = 2; i * i <= a; i++){
if(a % i == 0){
flag = 1;
break;
}
}
if(flag == 0){
k++;
num[k] = a;
}
}
for(int i = m - 1, j = 1; i < n; i++, j++){
if(j % 10 != 0){
if(i != n - 1) printf("%d ", num[i]);
else printf("%d", num[i]);
}else printf("%d\n", num[i]);
}
return 0;
}
当然,如果需要输出的素数特别往后的话,那么数组可能就不够用了。所以将程序优化为:计算素数时添加一个计数器,将符合范围的素数添加入数组内,当计数器大于范围上界时,循环结束。输出结果。
#include <iostream>
#include <vector>
using namespace std;
vector<int>num;
int m, n, countNum, a = 2, flag = 0, timeP = 0;
bool isPrime(int num){
for(int i = 2; i * i <= num; i++)
if(num % i == 0)
return false;
return true;
}
int main(){
cin>>m>>n;
while(countNum < n){
flag = 0;
if(isPrime(a)){
countNum++;
if(countNum >= m) num.push_back(a);
}
a++;
}
for(unsigned int i = 0; i < num.size(); i++){
if((i + 1) % 10 != 1) cout<<" ";
cout<<num[i];
if(++timeP % 10 == 0) cout<<endl;
}
return 0;
}