题意:求区间L,R,之间距离最远的和最近的相邻素数。
题目链接:点击打开链接
详细见代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
//const int maxn = 1e5+100;
#define INF 0x3f3f3f3f
const int MOD=1000000000;
#define PI acos(-1.)
#define VV PI*mid*(r*r+r*RR+RR*RR)/3.0
const int maxn=1e6+100;
int prime[maxn];
int pri[maxn];
int A[maxn];
int _[maxn];
int n,m,mm,nn;
void init()
{
int i,j;
for(i=1;i<=1000002;i++)
pri[i]=i;
m=1;
for(i=2;i<=1000002;i++)
{
if(pri[i]==i)
{
prime[m++]=i;
}
for(j=1;j<m&&(LL)i*prime[j]<=1000002;j++)
{
pri[i*prime[j]]=i;
if(i%prime[j]==0) break;
}
}
}
int get()
{
mm=1;
int i,j;
for(i=1;i<=n;i++)
{
_[i]=i;
}
// cout<<A[n]<<endl;;
for(i=1;i<m&&(LL)prime[i]*prime[i]<=A[n];i++)
{
// cout<<i<<endl;
j=A[1]/prime[i]+(A[1]%prime[i]>0);
if(j==1) j=2;
// cout<<j*prime[i]<<endl;
for(;(LL)j*prime[i]<=A[n];j++)
{
// cout<<j*prime[i]<<endl;
if((LL)j*prime[i]>=A[1])
_[j*prime[i]-A[1]+1]=0;
}
}
nn=1;
for(i=1;i<=n;i++)
if(_[i]==i)
A[nn++]=A[i];
return 0;
}
int main()
{
int L,R;
init();
while(scanf("%d%d",&L,&R)!=EOF)
{
int i;
n=0;
for(i=1; ;i++)
{
A[i]=L+i-1;
if(L+i-1>R) break;
if(A[i]>=2) A[++n]=A[i];
}
// cout<<n<<endl;
// cout<<A[n]<<endl;
get();
// cout<<nn<<endl;
if(nn<3)
{
printf("There are no adjacent primes.\n");
continue;
}
int Min=2;
int Max=2;
for(i=3;i<nn;i++)
{
if(A[i]-A[i-1]<A[Min]-A[Min-1])
Min=i;
if(A[i]-A[i-1]>A[Max]-A[Max-1])
Max=i;
}
printf("%d,%d are closest, %d,%d are most distant.\n",A[Min-1],A[Min],A[Max-1],A[Max]);
}
return 0;
}