http://projecteuler.net/index.php?section=problems&id=35
100万までの素数を求めてsetにしてすぐに素数判定ができるようにする。
回転はalgorithmのrotateを使う。
#include <iostream> #include "primes.h" using namespace std; using namespace itertools; set<int> set_primes; bool is_prime(int n) { return set_primes.find(n) != set_primes.end(); } bool is_circular_primes(int n) { if(is_prime(n)) { vector<int> v = list(reversed(list(digits(n)))); for(int k = 1; k < (int)v.size(); k++) { rotate(v.begin(), v.begin() + 1, v.end()); if(!is_prime(to_number(iterable(v)))) return false; } return true; } else { return false; } } int main() { const int N = (int)1e6; vector<int> v = primes::sieve(N); set_primes.insert(v.begin(), v.end()); cout << length(filter(is_circular_primes, range<>(1, N))) << endl; }