Filename: prob35.cc
// Problem 35 // The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime. // // There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97. // // How many circular primes are there below one million? #include <iostream> #include <math.h> #include <sstream> #include <vector> #include <algorithm> #define UB 1000000 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 nextCircular(string s) { s.push_back(s.at(0)); s.erase(s.begin()); 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; for(unsigned int i=3; i<UB; i+=2) { if(isPrime(i)) { primes.push_back(i); } } int count = 1; // for 2 for(vector<unsigned int>::const_iterator i = primes.begin(); i != primes.end(); ++i) { bool all_prime = true; string working_value = toString(*i); while((working_value = nextCircular(working_value)) != toString(*i)) { if(!isPrime(toInt(working_value), primes)) { all_prime = false; break; } } if(all_prime) { ++count; } } cout << "answer: " << count << endl; return 0; }
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment