Euler_35.cpp (1158B)
1 #include <algorithm> 2 3 #include "Euler.h" 4 5 int Euler::NoOfCircularPrimes() 6 { 7 int total = 2; //this algorithm misses out 2 and 5 8 9 std::vector<int> primes = EulerUtility::getPrimesUnderCeilingIndexed(1000000); 10 11 for (int prime : primes) 12 { 13 if (prime != -1) 14 { 15 bool potentialCircularPrime = true; 16 17 std::vector<int> digits = EulerUtility::intToDigits(prime); 18 19 for (int digit : digits) 20 if ((digit == 0) || (digit == 5) || (digit % 2 == 0)) 21 { 22 potentialCircularPrime = false; 23 break; 24 } 25 26 if (potentialCircularPrime) 27 for (int j = 0; j <= log10(prime); ++j) 28 { 29 if (primes[EulerUtility::digitsToInteger(digits)] == -1) 30 { 31 potentialCircularPrime = false; 32 break; 33 } 34 35 std::rotate(digits.begin(), digits.begin() + 1, digits.end()); 36 } 37 38 if (potentialCircularPrime) 39 ++total; 40 } 41 } 42 43 return total; 44 }