AOJ 1276,PKU 3518 Prime Gap
解法
篩を使って範囲内の全素数を求めて配列に答を代入していく.
実装(C++)
#include <iostream> #include <vector> using namespace std; vector<bool> eratosthenes_sieve(int n){ vector<bool> res(n+1); res[0]=res[1]=false;res[2]=true; int i,j; for(i=3;i<=n;i+=2){ if(i*i<=n){ if(res[i]==false){ for(j=i+i+i;j<=n;j+=i+i){ res[j]=true; } } } res[i]=!res[i]; } return res; } vector<int> prime_list(const vector<bool>& isprime){ vector<int> res;if(isprime.size()<=2)return res; res.push_back(2); for(unsigned int i=3;i<isprime.size();i+=2) if(isprime[i])res.push_back(i); return res; } vector<int> prime_list(int n){ return prime_list(eratosthenes_sieve(n)); } vector<int> a(1299710); int main() { vector<int> pl=prime_list(1299710); for(int i=0;i<(int)pl.size()-1;i++){ for(int j=pl[i]+1;j<pl[i+1];j++){ a[j]=pl[i+1]-pl[i]; } } int n; for(;cin>>n,n;){ cout<<a[n]<<endl; } return 0; }