給定整數 n (n ≤ 1,299,709),若 n 是素數輸出 0;否則輸出 n 所在的素數間隔長度(即緊鄰 n 的兩個素數之差)。
#include
#include
#include
using namespace std;
const int MAXN = 1300000;
bool isComp[MAXN];
vector primes;
void sieve() {
int limit = sqrt(MAXN) + 1;
for (int i = 2; i <= limit; i++) {
if (!isComp[i]) {
for (int j = i*i; j < MAXN; j += i) isComp[j] = true;
}
}
for (int i = 2; i < MAXN; i++) if (!isComp[i]) primes.push_back(i);
}
int main() {
sieve();
int n;
while (scanf("%d", &n) == 1 && n) {
if (!isComp[n]) {
printf("0\n");
} else {
// 二分查找第一個 > n 的素數
int l = 0, r = primes.size() - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (primes[mid] > n) r = mid;
else l = mid + 1;
}
printf("%d\n", primes[l] - primes[l-1]);
}
}
return 0;
}