Euler_50.cpp (1657B)
1 #include <numeric> 2 3 #include "Euler.h" 4 5 int Euler::ConsecutivePrimeSum() 6 { 7 std::vector<int> primes = EulerUtility::getPrimesUnderCeiling(1000000); 8 std::vector<int> primes2 = EulerUtility::getPrimesUnderCeilingIndexed(1000000); 9 10 int highestPotential = 0; 11 12 for (int i = 0; i < 600; ++i) 13 { 14 int potentialPrime = std::accumulate(primes.begin(), primes.begin() + 600 - i, 0); 15 16 if (potentialPrime < 1000000) 17 { 18 if (potentialPrime == primes2[potentialPrime]) 19 { 20 highestPotential = potentialPrime; 21 int greatestLength = 600 - i; 22 23 for (int j = 1; ; ++j) 24 { 25 bool firstPass = true; 26 27 for (int k = 1; ; ++k) 28 { 29 potentialPrime = std::accumulate(primes.begin() + j, primes.begin() + 600 - i + j + k, 0); 30 31 if (potentialPrime < 1000000) 32 { 33 if ((potentialPrime == primes2[potentialPrime]) && (600 - i + k > greatestLength)) 34 { 35 highestPotential = potentialPrime; 36 greatestLength = 600 - i + k; 37 } 38 39 firstPass = false; 40 } 41 else 42 { 43 if (firstPass) 44 return highestPotential; 45 46 break; 47 } 48 } 49 } 50 } 51 } 52 } 53 54 return 0; 55 }