int main() { // Sieve all primes under 1 million const int MAX = 1000000; std::vector<bool> const * const IS_PRIME = PrimeSieve(MAX); // Make an array of just the primes std::vector<int> primes; for (int i = 0; i < MAX; ++i) { if (IS_PRIME->at(i)) { primes.push_back(i); } } const int N_PRIMES = static_cast<int>(primes.size()); // Put a limit on the maximum number of primes we can sum together without // go over MAX. We start at the lowest prime because this will give us the // most primes, and hence the more stringent limit. int max_length = 0; int total = 0; for (int i = 0; i < N_PRIMES; ++i) { total += primes[i]; if (total < MAX) { max_length++; } } // We now sum numbers from our primes list and test to see if the result is // also prime int64_t prime_from_sum = 0; int longest_length = 0; for (int test_length = max_length; test_length >= 2; test_length--) { if (test_length < longest_length) { break; } for (int start = 0; start < N_PRIMES - test_length; start++) { int64_t test_sum = 0; for (int i = start; i < start + test_length; i++) { test_sum += primes[i]; } if (test_sum > MAX) { break; } else if (IS_PRIME->at(test_sum) && test_length > longest_length) { prime_from_sum = test_sum; longest_length = test_length; } } } std::cout << prime_from_sum << " is the sum of " << longest_length << " primes." << std::endl; return 0; }
void TenThousandFirstPrime() { auto number = PrimeSieve(10001, 125000); std::cout << number << std::endl; }