素数砂漠なん!!!
問題へのリンク
問題概要
整数 が与えられる。 を含む素数砂漠 (連続する合成数) の長さを求めよ。
すなわち、 以上の最小の素数と、 以下の最大の素数との差を求めよ。
制約
解法
エラトステネスの篩で予め 2000000 くらいまでの整数について素数かどうかをテーブルで持っておく
#include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; const int MAX = 10001000; bool IsPrime[MAX]; vector<int> Era(int n = MAX) { vector<int> res; IsPrime[0] = false; IsPrime[1] = false; for (int i = 2; i < n; ++i) IsPrime[i] = true; for (int i = 2; i < n; ++i) { if (IsPrime[i]) { res.push_back(i); for (int j = i*2; j < n; j += i) IsPrime[j] = false; } } return res; } int main() { Era(); long long N; while (cin >> N) { if (N == 0) break; int prev = N, next = N; while (!IsPrime[prev]) --prev; while (!IsPrime[next]) ++next; cout << next - prev << endl; } }