令 Pi 表示第 i 个素数。现任给两个正整数 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
/*
本题可直接暴力求解,题目最大测试数据
M=1,N=10000时,每一个素数都要查找。
暂时没有找到优化的方法,不如暴力求解10000
个素数放进数组,输出时按照下标进行输出。
输出第n个数的时候直接通过下标操作,比较方便;
*/
#include<iostream>
#include<cmath>
using namespace std;
//判断n是否是素数;0表示不是素数;
int prime(int n){
int max=(int)sqrt((double)n); //max作为最大因子的边界;
int i; //这里如果n为非素数,那么在max之前一定能找到一个因子;
int ret=0; //返回值为0表示为非素数;
for(i=2;i<=max;i++){
if(n%i==0)
{break;}
}
if((i>max&&max!=1)||n==2||n==3) //这里2和3的max都是1,不会进入循环;
{ret=1;}
return ret;
}
int main(){
int Prime[10000]; //存放素数;
int count=0; //记录素数个数;
int n=1; //作为自然数增加;
while(count<10000){
if(prime(n)==1){
Prime[count]=n;
count++;
}
n++;
}
//输入M和N;
int M,N;
cin>>M>>N;
//输出素数;
int flag=0; //换行标志;
for(int i=M-1;i<N;i++){ //注意数组下标从0开始,所以这里是从M-1开始而不是M开始;
flag++; //对每行输出个数进行计数;
if(flag%10==0){ //第10个则换行;
cout<<Prime[i]<<endl;
}
else{
cout<<Prime[i];
if(i<N-1){
cout<<" "; //行末无空格,单独输出;
}
}
}
return 0;
}
/*
解题反思:
还是素数的老规矩,因子的边界(int)sqrt((double)x);是算术平方根;
然后这里考虑到N最大为10的4次方时,每一个素数都数出来,不如直接就
全部求出来,绝对不会超时,因为当取最大N时也是每个数都要数出来;
*/