质数距离

#include <cstdio>
#include <cstring>
#include <iostream> 
using namespace std;

const long long MAXR = 1e5 + 5; 
const long long MAXN = 1e6 + 10;
const long long INF = 0x7f7f7f7f7f7f;
const long long MAXLEN = 1e5 + 10;

long long l, r, cnt, poi;
long long prime[MAXLEN];
long long isprime[MAXN];

bool vis[MAXLEN];
bool flag[MAXN];

void MakeSet (long long);

int main () {
	MakeSet (MAXR);
	while (cin >> l >> r) {
		if (l == 1) l++;
		memset (flag, 0, sizeof (flag)); poi = 0;
		for (long long i = 1; i <= cnt; i++) {
			for (long long j = l / prime[i]; j <= r / prime[i]; j++) {
				if (j * prime[i] < l) continue;
				if (j == 1) continue;
				flag[j * prime[i] - l] = 1;
			}
		}
		for (long long i = l; i <= r; i++) {
			if (flag[i - l] == 0) isprime[++poi] = i;
		}
		if (poi <= 1) cout << "There are no adjacent primes." << endl;
		else {
			long long maxindex, maxval = -INF, minindex, minval = INF;
			for (long long i = 2; i <= poi; i++) {
				long long tem = isprime[i] - isprime[i - 1];
				if (tem > maxval) {
					maxval = tem;
					maxindex = i;
				}
				if (tem < minval) {
					minval = tem;
					minindex = i;
				}
			}
			printf ("%lld,%lld are closest, %lld,%lld are most distant.\n", isprime[minindex - 1], isprime[minindex], isprime[maxindex - 1], isprime[maxindex]);
		}
	}
	return 0;
}

void MakeSet (long long n) {
	vis[1] = 0;
	for (long long i = 2; i <= n; i++) {
		if (vis[i] == 0) prime[++cnt] = i;
		for (long long j = 1; j <= cnt; j++) {
			if (i > n / prime[j]) break;
			vis[i * prime[j]] = 1;
			if (i % prime[j] == 0) break;
		}
	}
}
posted @ 2020-08-10 19:17  C2022lihan  阅读(48)  评论(0编辑  收藏  举报