/**//** 0.09s* 很郁闷了二天,得个教训:数据类型千万要统一*/#include <iostream>#include <cmath>using namespace std ;#define MAXN 48000bool 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-x < MIN ) ...{ MIN = k-x ; a = x ; b = k ; } if ( k-x > 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 ;}