Filename: prob37.cc
// Problem 37 // The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3. // // Find the sum of the only eleven primes that are both truncatable from left to right and right to left. // // NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. #include <iostream> #include <math.h> #include <sstream> #include <vector> #include <algorithm> #define UB 1000000 #define NUMBER_OF_LR_TRUNC_PRIMES 11 using namespace std; static inline bool isPrime(const unsigned int n, const vector<unsigned int> &primes) { return primes.end() != find(primes.begin(), primes.end(), n); } static bool isPrime(const unsigned int n) { if(n%2 == 0) return false; for(int i=3; i<=ceil(sqrt(n)); i+=2) { if(n%i == 0) { return false; } } return true; } static inline string toString(const unsigned int n) { stringstream out; out << n; return out.str(); } static inline string nextTruncLeft(string s) { s.erase(s.begin()); return s; } static inline string nextTruncRight(string s) { s.erase(s.length()-1); return s; } static inline unsigned int toInt(const string &s) { int retval; istringstream i(s); i >> retval; return retval; } int main() { vector<unsigned int> primes; primes.push_back(2); for(unsigned int i=3; i<UB; i+=2) { if(isPrime(i)) { primes.push_back(i); } } int total = 0; int count = 0; for(vector<unsigned int>::const_iterator i = primes.begin(); i != primes.end() && count < NUMBER_OF_LR_TRUNC_PRIMES; ++i) { if(*i >= 10) { bool prime = true; for(string working = toString(*i); working.length() >= 1 && prime; working = nextTruncLeft(working)) { if(!isPrime(toInt(working), primes)) { prime = false; } } for(string working = toString(*i); working.length() >= 1 && prime; working = nextTruncRight(working)) { if(!isPrime(toInt(working), primes)) { prime = false; } } if(prime) { cout << *i << endl; total += *i; ++count; } } } cout << "answer: " << total << endl; return 0; }
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment