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におとせば出来るのかなぁ・・?要再挑戦。