project-euler

https://projecteuler.net/
Log | Files | Refs | README

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 }