Project Euler 45

三角数, 五角数, 六角数は以下のように生成される.

三角数	T_n=n(n+1)/2	1, 3, 6, 10, 15, ...
五角数	P_n=n(3n-1)/2	1, 5, 12, 22, 35, ...
六角数	H_n=n(2n-1)	1, 6, 15, 28, 45, ...
T_285 = P_165 = H_143 = 40755であることが分かる.

次の三角数かつ五角数かつ六角数な数を求めよ.

C/C++

#include <iostream>
#include <algorithm>
#include <deque>
#include <cmath>

using namespace std;

int main(){
	deque<__int64> penta;
	deque<__int64> hexa;
	deque<__int64> v(100), v2(100);
	deque<__int64>::iterator it, it2;

	for(int i=1 ; i<=100000 ; i++){
		penta.push_back((__int64)i*(__int64)(3*i-1)/(__int64)2);
		hexa.push_back((__int64)i*(__int64)(2*i-1));		
	}

	sort(hexa.begin() , hexa.end() );
	sort(penta.begin(), penta.end() );

	it = set_intersection(penta.begin(), penta.end(), hexa.begin(), hexa.end(), v.begin());
	
	for(deque<__int64>::iterator itt=v.begin() ; itt != it ; itt++){
		cout << *itt << endl;
	}
	
	cout << "Finish" << endl;

	int end;
	cin >> end;
}

すいません手抜きです。VC++環境でしか使えない __int64型が思い切り使われてます・・・
六角数ならば三角数なので、六角数と五角数の共通部分を抜き出してます。set_intersection便利。
__int64を使わないでやろうとすると、stringにおとせば出来るのかなぁ・・?要再挑戦。