题意:给你一个L,U,求L到U中相邻最近的两个素数和相邻最远的两个素数,(1<=L<U<=2147483647) 即maxn = 2147483647
素数筛选法预处理出sqrt(maxn)的素数表,对于给定的L,U,也是相当于筛选法,只需要把L,U范围内素数的倍数筛选掉就行
#include <stdio.h>
#define LL long long
bool vis[111111], vis1[1111111];
LL pri[111111];
LL max(LL a, LL b) {
return a > b ? a : b;
}
int main() {
int i;
LL j;
int num = 0;
vis[1] = 1;
for(i = 2;i*i <= 100000; i++) if(!vis[i])
for(j = i*i;j <= 100000; j += i)
vis[j] = 1;
for(i = 2;i <= 100000; i++) if(!vis[i])
pri[num++] = i;
LL l, r;
while(scanf("%lld%lld", &l, &r) != -1) {
LL len = r-l;
for(i = 0;i <= len; i++) vis1[i] = 0;
for(i = 0;i < num && pri[i]*pri[i] <= r; i++) {
LL now = max(l/pri[i]*pri[i], pri[i]*pri[i]);
for(j = now;j <= r; j += pri[i]) if(j >= l)
vis1[j - l] = 1;
}
if(l == 1) vis1[0] = 1;
int ans1 = 11111111, ans2 = 0, pre = 0, maxa, maxb, mina, minb;
for(i = 0;i <= len; i++) {
if(!vis1[i]) {
if(pre) {
if(i+l-pre < ans1)
ans1 = i+l-pre, mina = pre, minb = i+l;
if(i+l-pre > ans2)
ans2 = i+l-pre, maxa = pre, maxb = i+l;
}
pre = i+l;
}
}
if(ans2)
printf("%d,%d are closest, %d,%d are most distant.\n", mina, minb, maxa, maxb);
else
puts("There are no adjacent primes.");
}
return 0;
}
// 2147400000 2147483647