nth_prime: passes tests
This commit is contained in:
parent
a3d06da574
commit
a2c1c4a6ac
1 changed files with 16 additions and 13 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
#include "nth_prime.h"
|
#include "nth_prime.h"
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
@ -14,7 +13,7 @@ using namespace std;
|
||||||
number_t nth(size_t n)
|
number_t nth(size_t n)
|
||||||
{
|
{
|
||||||
if (n < 1)
|
if (n < 1)
|
||||||
throw std::domain_error("invalid prime index");
|
throw domain_error("invalid prime index");
|
||||||
|
|
||||||
vector<number_t> primes = {2, 3, 5, 7, 11, 13};
|
vector<number_t> primes = {2, 3, 5, 7, 11, 13};
|
||||||
primes.reserve(n - 1);
|
primes.reserve(n - 1);
|
||||||
|
|
@ -26,11 +25,12 @@ number_t nth(size_t n)
|
||||||
|
|
||||||
size_t page = 0;
|
size_t page = 0;
|
||||||
|
|
||||||
while (primes.size() < n) {
|
while (primes.size() < n - 1) {
|
||||||
|
|
||||||
for (auto p : primes) {
|
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) {
|
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;
|
number_t p = page*sieve_size + i;
|
||||||
//cout << page << " " << i << " " << new_prime << endl;
|
primes.push_back(p);
|
||||||
primes.push_back(new_prime);
|
|
||||||
break;
|
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];
|
return primes[n - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue