题目:令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
在第四个测试点跪了好几次,经过不断的调整发现我的这种算法的i必须在[104750,104780]范围内。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m,n,p[10005];
cin>>m>>n;
int i,j,flag,t=0;
//普通求解
for(i=2;i<104780;i++){
flag=0;
for(j=2;j<=sqrt(i);j++){
if(i%j==0){
flag=1;break;
}
}
if(!flag) p[t++]=i;
}
//优化求解:如果一个数不能被比它小的素数整除,那么这个数就是素数。
p[0]=2;
for(i=2;i<104750;i++){
flag=0;
for(j=0;j<t;j++){
if(i%p[j]==0){
flag=1;break;
}
}
if(!flag) p[t++]=i;
}
int num=1;
for(i=m-1;i<n;i++){
cout<<p[i];
if((num%10)&&(i<n-1)) cout<<" ";
else cout<<endl;
++num;
}
return 0;
}
补充:快被自己蠢哭了,只要加一个条件判断,i根本就不怕大。
#include<iostream>
using namespace std;
int main()
{
int t=0,m,n,p[10005];
cin>>m>>n;
int i,j;
bool flag;
p[0]=2;
for(i=2;i<200000;i++){
flag=0;
for(j=0;j<t;j++){
if(i%p[j]==0){
flag=1;break;
}
}
if(!flag) p[t++]=i;
if(t==10004) break;
}
int num=1;
for(i=m-1;i<n;i++){
cout<<p[i];
if((num%10)&&(i<n-1)) cout<<" ";
else cout<<endl;
++num;
}
return 0;
}