Esempio n. 1
0
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;
}