您的位置:首页 > 其它

poj2689 两次素数筛法

2016-07-17 12:53 316 查看
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=50000;
bool vis[MAX],isp[1000005];
int prime[MAX],res[100000];
int num=0;
long long l,u;
void getprime()
{
memset(vis,true,sizeof(vis));
vis[1]=false;
long long i,j;
for(i=2;i<=MAX;i++)
if(vis[i])
{
num++;
prime[num]=i;
for(j=i*i;j<=MAX;j+=i)
vis[j]=false;
}
}

void work()
{
long long i,j,cnt=0,tmp,c1,c2,d1,d2;
memset(isp,true,sizeof(isp));
for(i=1;i<=num&&prime[i]*prime[i]<=u;i++)
{
tmp=l/prime[i];//快速找到l~u区间内素数的位置
if(tmp*prime[i]<l)
tmp++;
if(tmp==1) tmp++;
for(j=tmp*prime[i];j<=u;j+=prime[i])
isp[j-l]=false;
}
if(l==1)
isp[0]=false;
for(i=0;i<=u-l;i++)
{
if(isp[i])//表示到l距离为i的点是否是素数
{
res[cnt++]=i+l;//还原该素数
}
}

if(cnt<=1)
cout<<"There are no adjacent primes."<<endl;
else
{
long long maxn=0,minn=0xfffffff;
for(i=1;i<cnt;i++)
{
if(res[i]-res[i-1]<minn)
{
minn=res[i]-res[i-1];
c1=res[i-1];
c2=res[i];
}
if(res[i]-res[i-1]>maxn)
{
maxn=res[i]-res[i-1];
d1=res[i-1];
d2=res[i];
}

}
cout<<c1<<','<<c2<<" are closest, "<<d1<<','<<d2<<" are most distant."<<endl;
}
}

int main()
{
while(cin>>l>>u)
{
getprime();
work();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论