in:
2147483 3532156
out:
3196067,3196068 are closest, 3117299,3117421 are most distant.
3196067 和 3196068 都不是质数,
in:
3196067 3196069
out:
There are no adjacent primes.
经调试,上面数据的质数数组为空。
好怪,
代码:
#include <iostream>
#include <math.h>
#include <string.h>
#define int long long
using namespace std;
const int MAXN = 1048576;
bool NOT_PRIME[MAXN];
int PRIME[MAXN],len ;
int l,r;
int prime[] = {-1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193...省略区间[194,sqrt(2147483647)]的所有质数
};
void ERATOSTHENES(int l,int r){
for(int i = 1;prime[i]*prime[i] <= r;i ++){
int &p = prime[i];
int t = 1;
for(int j = l;j <= r;j += t){
if(j%p == 0 && j != p)
t = p,NOT_PRIME[j-l] = true;
}
}
for(int i = l;i <= r;i ++)
if(!NOT_PRIME[i-l]) PRIME[++ len] = i;//cout << PRIME[len] << ' ';
if(len <= 1) return puts("There are no adjacent primes."),void();
int MIN = 9e+17,MAX = 0;
int min_a,min_b,max_a,max_b;
for(int i = 2;i <= len;i ++){
int aw = PRIME[i]-PRIME[i-1];
if(MIN > aw) MIN = aw,min_a = PRIME[i-1],min_b = PRIME[i];
if(MAX < aw) MAX = aw,max_a = PRIME[i-1],max_b = PRIME[i];
}
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",min_a,min_b,max_a,max_b);
}
signed main(){
while(scanf("%lld %lld",&l,&r) != EOF) memset(NOT_PRIME,false,sizeof NOT_PRIME),len = 0,ERATOSTHENES(l,r);
return 0;
}