http://projecteuler.net/index.php?section=problems&id=46
これも一致する値を探すが、探すだけなので同じコードを使えなかった。
一致しない最初の値を出すので、dropwhileを作った。
#include <iostream> #include <cmath> #include "primes.h" using namespace itertools; template<typename T, typename U> bool is_coincident(T& gen1, U& gen2) { decltype(gen1.next()) v1; decltype(gen2.next()) v2; if(!gen1.exists_next() || !gen2.exists_next()) return false; v1 = gen1.next(); v2 = gen2.next(); while(true) { if(v1 == v2) { return true; } else if(v1 < v2) { if(!gen1.exists_next()) return false; v1 = gen1.next(); } else { if(!gen2.exists_next()) return false; v2 = gen2.next(); } } } bool is_GoldBach(int n) { auto g1 = primes::genPrimes(); int upper = int(sqrt((double)n / 2)); auto c = range<>(upper, -1, -1); auto g2 = map([n] (int m) { return n - 2 * m * m; }, c); bool b = is_coincident(g1, g2); return b; } int main() { int n = head(dropwhile(is_GoldBach, count<>(9, 2))); std::cout << n << std::endl; }