poj 2689
两次筛选。
代码:
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
long long a[47001];
long long b[47001];
long long c[1000001];
int mark[1000001];
void read(){
// ifstream cin("in.txt");
long long i,j,k,top=0,top2;
long long s,t,n1,n2,n3,n4;
b[0]=2;
for(i=4;i<=47000;i+=2)
a[i]=1;
for(i=3;i<=47000;i+=2)
if(a[i]==0)
{
b[++top]=i;
for(j=i*2;j<=47000;j+=i)
a[j]=1;
}
while(cin>>s>>t){
memset(mark,0,sizeof(mark));
top2=0;
if(s==1) s++;
for(i=0;i<=top&&b[i]*b[i]<=t;i++)
{
j=s/b[i];
if(j*b[i]<s) j++;
if(j==1) j++;
for(k=j*b[i];k<=t;k+=b[i])
mark[k-s]=1;
}
for(i=s;i<=t;i++)
if(mark[i-s]==0)
c[top2++]=i;
if(top2<=1)
{
cout<<"There are no adjacent primes."<<endl;
}
else
{
n3=1000001;n4=0;
for(i=0;i<top2-1;i++)
{
if(c[i+1]-c[i]<n3)
{
n3=c[i+1]-c[i];
n1=i;
}
if(c[i+1]-c[i]>n4)
{
n4=c[i+1]-c[i];
n2=i;
}
}
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",c[n1],c[n1+1],c[n2],c[n2+1]);
}
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号