Project Euler 49

項差3330の等差数列1487, 4817, 8147は次の2つの変わった性質を持つ。

(i)3つの項はそれぞれ素数である。
(ii)各項は他の項の置換で表される。
1, 2, 3桁の素数にはこのような性質を持った数列は存在しないが、4桁の増加列にはもう1つ存在する。

それではこの数列の3つの項を連結した12桁の数を求めよ。

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2049
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;

deque<bool> p;

/*
maxまでの素数を計算する。
あらかじめ 
deque<bool> p; 
をグローバルで宣言しておいてね
*/
void calcPrime(const int max){
	for(int i=0 ; i<max+1 ; i++){
		p.push_back(true);
	}
	p[0] = false;
	p[1] = false;

	double myEnd = sqrt(double(max));
	for(int i=2 ; i < myEnd ; i++){
		for(int j=2 ; i*j<=max ; j++){
			p[i*j] = false;
		}
	}
}

// nが素数かどうか
bool isPrime(int n){
	return p[n];
}


// xを各桁ごとにばらしてdequeに挿入する。
deque<int> integerDigits(long long x){
	deque<int> arr;
	while(x!=0){
		arr.push_front(x%10);
		x/=10;
	}
	return arr;
}


int main(){
	calcPrime(10000);
	deque<int> d1, d2, d3;

	int k;
	for(int i=1000 ; i<10000 ; i++){
		if(!isPrime(i)) continue;

		d1 = integerDigits(i);
		sort(d1.begin(), d1.end());

		for(int j=i+1 ; j<10000 ; j++){
			if(!isPrime(j)) continue;

			d2 = integerDigits(j);
			sort(d2.begin(), d2.end());

			if(!(d1==d2)) continue;

			k = 2*j-i;

			if(k>=10000 || !isPrime(k)) continue;

			d3 = integerDigits(k);
			sort(d3.begin(), d3.end());

			if(d2==d3)
				cout << "i -> " << i << ",j -> " << j << ",k -> " << k << endl;
		}
	}

}

これで1〜50までは全てクリア。