#include <iostream> #define LENGTH 1024 * 256 using namespace std; int N; bool Primes[LENGTH] = { false }; int CountOfPrimes[LENGTH] = { 0 }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // 에라토스테네스의 체로 소수를 구한다. Primes[0] = Primes[1] = true; for (size_t i = 2; i < LENGTH; i++) { if (Primes[i]) continue; for (size_t j = i * 2; j < LENGTH; j += i) Primes[j] = true; } // 베르트랑 공준은 아래의 점화식으로 구할 수 있다. // B(N) = P(2 * N) - P(N) // P(n)은 n 이하에서의 소수의 개수다. // 따라서 소수의 개수를 구해준다. for (size_t i = 2; i < LENGTH; i++) { // 소수의 개수는 아래의 점화식과 같다. // P(N) = (N is prime) ? P(N - 1) + 1 : P(N - 1) CountOfPrimes[i] = CountOfPrimes[i - 1]; if (Primes[i] == false) ++CountOfPrimes[i]; } while (true) { cin >> N; if (N == 0) break; cout << CountOfPrimes[2 * N] - CountOfPrimes[N] << '\n'; } } |