Project Euler 35

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;
}