diff --git a/cpp/nth-prime/nth_prime.cpp b/cpp/nth-prime/nth_prime.cpp index 348460d..92d6dd5 100644 --- a/cpp/nth-prime/nth_prime.cpp +++ b/cpp/nth-prime/nth_prime.cpp @@ -1,6 +1,5 @@ #include "nth_prime.h" -#include #include #include #include @@ -14,7 +13,7 @@ using namespace std; number_t nth(size_t n) { if (n < 1) - throw std::domain_error("invalid prime index"); + throw domain_error("invalid prime index"); vector primes = {2, 3, 5, 7, 11, 13}; primes.reserve(n - 1); @@ -26,11 +25,12 @@ number_t nth(size_t n) size_t page = 0; - while (primes.size() < n) { + while (primes.size() < n - 1) { for (auto p : primes) { - size_t start = page*sieve_size % p; + size_t start = ((page*sieve_size + p - 1)/p)*p + - page*sieve_size; for (size_t i = start; i < sieve_size; i += p) { @@ -38,21 +38,24 @@ number_t nth(size_t n) } } - for (auto i : sieve) { + for (size_t i = 0; i < sieve_size; ++i) { - if (!sieve[i]) { + if (sieve[i]) + continue; - number_t new_prime = page*sieve_size + i; - //cout << page << " " << i << " " << new_prime << endl; - primes.push_back(new_prime); - break; + number_t p = page*sieve_size + i; + primes.push_back(p); + + for (size_t j = i; j < sieve_size; j += p) { + + sieve[j] = true; } } - //if ( - //memset(sieve, 0, sieve_size); + memset(sieve, 0, sieve_size); + ++page; } - + return primes[n - 1]; }