求L和U之间距离最近和最远的相邻素数。
刚开始写的超时,打出素数表之后直接顺序判断L和U之间的数,造成了超时。
先打出1至48000之间的素数,然后用这些素数去筛选L和U之间的数,U-L<1000000;注意处理L=1,的情况
代码:
#include <stdio.h>
#include <string.h>
int pnum;
int prime[30000],lr[1000001];
bool isprime(int n)
{
if(n==1)
return false;
for(int i=0;i<pnum&&prime[i]*prime[i]<=n;i++)
if(n%prime[i]==0)
return false;
return true;
}
void getprime()
{
prime[0]=2;
prime[1]=3;
pnum=2;
for(int i=5;i<48000;i++)
{
if(isprime(i))
prime[pnum++]=i;
}
}
void slove(int l,int r)
{
memset(lr,0,sizeof(lr));
for(int i=0;i<pnum;i++)
{
int s=(l-1)/prime[i]+1;
int t=r/prime[i];
for(int j=s;j<=t;j++)
{
if(j>1)
lr[j*prime[i]-l]=1;
}
}
if(l==1)
lr[0]=1;
int k=-1,maxn=-1,minn=99999999;
long long upx=0,upy=0,downx=0,downy=0;
for(int i=0;i<=r-l;i++)//有次错误是:i可以等于r-l的。
{
if(lr[i]==0)
{
if(k==-1)
{
k=i;
}
else
{
if(i-k<minn)
{
minn=i-k;
upx=k;
upy=i;
}
if(i-k>maxn)
{
maxn=i-k;
downx=k;
downy=i;
}
k=i;
}
}
}
if(maxn==-1)
printf("There are no adjacent primes.\n");
else
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",upx+l,upy+l,downx+l,downy+l);
}
int main()
{
getprime();
int L,U;
while(scanf("%d %d",&L,&U)!=EOF)
{
slove(L,U);
}
return 0;
}