刚做素数部分,把以前不懂的题目搞定了。还不错。
#include<iostream>
#define N 50001
using namespace std;
bool f[N],seg[1111111];
int prime[N],pcnt;
__int64 rec[1111111];
void deal( __int64 L,__int64 U )
{
memset( seg,true,sizeof(seg) );
for( int i=1;i<=pcnt;i++ )
{
__int64 j=L/prime[i];
while( j*prime[i]<L||j<=1 )
j++;
for( j=j*prime[i];j<=U;j+=prime[i] )
if( j>=L )
seg[j-L]=false;
}
if( L==1 )
seg[0]=false;
}
int main()
{
memset( f,true,sizeof(f) );
pcnt=0;
for( int i=2;i<N;i++ )
if( f[i] )
{
prime[++pcnt]=i;
for( int j=i+i;j<N;j+=i )
f[j]=false;
}
__int64 L,U;
int recnt;
while( scanf("%I64d %I64d",&L,&U)!=EOF )
{
deal(L,U);
recnt=0;
for( int i=0;i<=U-L;i++ )
if( seg[i] )
rec[recnt++]=i;
if( recnt<=1 )
{
printf( "There are no adjacent primes.\n" );
continue;
}
__int64 maxD,minD,maxL,minL;
maxD=0;minD=1111111;
for( int i=1;i<recnt;i++ )
{
if( rec[i]-rec[i-1]>maxD )
{
maxD=rec[i]-rec[i-1];
maxL=i;
}
if( rec[i]-rec[i-1]<minD )
{
minD=rec[i]-rec[i-1];
minL=i;
}
}
printf( "%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",rec[minL-1]+L,rec[minL]+L,rec[maxL-1]+L,rec[maxL]+L );
}
return 0;
}