exercism-solutions/cpp/nth-prime/nth_prime.cpp

62 lines
1.1 KiB
C++

#include "nth_prime.h"
#include <cstring>
#include <iostream>
#include <stdexcept>
#include <vector>
namespace prime {
using namespace std;
number_t nth(size_t n)
{
if (n < 1)
throw domain_error("invalid prime index");
vector<number_t> primes = {2, 3, 5, 7, 11, 13};
primes.reserve(n - 1);
static const size_t sieve_size = 32*1024;
bool sieve[sieve_size] = {0};
sieve[0] = sieve[1] = true;
size_t page = 0;
while (primes.size() < n - 1) {
for (auto p : primes) {
size_t start = ((page*sieve_size + p - 1)/p)*p
- page*sieve_size;
for (size_t i = start; i < sieve_size; i += p) {
sieve[i] = true;
}
}
for (size_t i = 0; i < sieve_size; ++i) {
if (sieve[i])
continue;
number_t p = page*sieve_size + i;
primes.push_back(p);
for (size_t j = i; j < sieve_size; j += p) {
sieve[j] = true;
}
}
memset(sieve, 0, sieve_size);
++page;
}
return primes[n - 1];
}
}