POJ 2689 数论

刚做素数部分,把以前不懂的题目搞定了。还不错。

#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;
}


你可能感兴趣的:(ini)