ZOJ1842

/*
* 0.09s
* 很郁闷了二天,得个教训:数据类型千万要统一
*/

#include 
< iostream >
#include 
< cmath >

using   namespace  std ;

#define  MAXN 48000

bool  primec[MAXN] ;
bool  num[ 1000010 ] ;
long   long  prime[MAXN], len ;
long   long  low, up ;
//  速度相对比较慢,但是不用开标记数组
/*void inti()


       prime[0] = 2, prime[1] = 3, len = 2;

       for (long long n=5,i; n<=MAXN; n+=2) {

              for (i=1; prime[i]*prime[i]<=n && n%prime[i]; i++);

              if (prime[i]*prime[i] > n) prime[len++] = n;

       }

}
*/

// 速度应该是最快的了,缺点就是要标记
void  inti()
{
    
long long i, j ;
    len 
= 1 ;
    prime[
0= 2 ; 
    memset(primec,
0,sizeof(primec)) ;
    
for ( i = 3 ; i <= sqrt(double(MAXN)) ; i += 2 ) {
        
if ( !primec[i] ) {
            
for ( j = i+i ; j < MAXN ; j += i ) {
                primec[j] 
= true ;
            }

        }

    }

    
for ( i = 3 ; i < 47000 ; i +=2 ) {
        
if ( !primec[i] ) prime[len++= i ;
    }

    
//printf ( "%d ", prime[len-1] ) ;
}


// 使用已经出来的素数继续筛选
// 注意中间过程数据很有可能超出范围
void  work()
{
    
if ( low == 1 ) low ++ ;
    memset(num,
0,sizeof(bool)*(up-low+1)) ;
    
long long i, j, x ;
//    int temp = sqrt(double(up)) ;
    
//try{
        for ( i = 0 ; prime[i]*prime[i]<=up ; i ++ ) {
            j 
= low/prime[i]+(low%prime[i]>0) ;
            
if ( j == 1 ) j ++ ;
            
for ( j*=prime[i] ; j <= up ; j += prime[i] ) {
                num[j
-low] = true ;
            }

        }

    
/*}
    catch (...) {
        printf ( "%d ", prime[i] ) ;
        printf ( "%d %d ", len, i) ;
    }
*/

    
long long k ;
    
long long a = -1, b = -1, MIN = 10000000 ;
    
long long c = -1, d = -1, MAX = -1 ;
    
for ( k = 0 ; k < up-low+1 ; k++ ) {
        
if ( !num[k] ) {
            x 
= k ;
            
break ;
        }

    }

    
for ( k++ ; k < up-low+1 ; k++ ) {
        
if ( !num[k] ) {
            
if ( k-< MIN ) {
                MIN 
= k-x ;
                a 
= x ; b = k ;
            }

            
if ( k-> MAX ) {
                MAX 
= k-x ;
                c 
= x ; d = k ;
            }

            x 
= k ;
        }

    }

    
if ( b == -1 ) {
        printf ( 
"There are no adjacent primes. " ) ;
    }

    
else {
        cout 
<< a+low << "," << b+low << " are closest, " 
            
<< c+low << "," << d+low << " are most distant. " ;
        
//printf ( "%lld,%lld are closest, %lld,%lld are most distant. ", a+low, b+low, c+low, d+low ) ;
    }

}

int  main (  void  )
{
    inti() ;
    
while ( 2 == scanf ( "%lld%lld"&low, &up ) ) {
        work() ;
    }

    
return 0 ;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值