トップページに戻る
次のC++のサンプルへ
前のC++のサンプルへ
Problem45 3角数かつ5角数かつ6角数な数
問題
3角数, 5角数, 6角数は以下のように生成される.
3角数 Tn=n(n+1)/2 1, 3, 6, 10, 15, ...
5角数 Pn=n(3n-1)/2 1, 5, 12, 22, 35, ...
6角数 Hn=n(2n-1) 1, 6, 15, 28, 45, ...
T285 = P165 = H143 = 40755であることが分かる.
次の3角数かつ5角数かつ6角数な数を求めよ.
ソース
#include <stdio.h>
#include <Windows.h>
__int64 CalcKakusuu(__int64 nankaku, __int64 N)
{
if (nankaku == 3) return N * (N + 1) / 2;
if (nankaku == 5) return N * (3 * N - 1) / 2;
return N * (2 * N - 1);
}
void main()
{
__int64 SankakuN = 2;
__int64 GokakuN = 2;
__int64 RokkakuN = 2;
__int64 SankakuVal = CalcKakusuu(3, SankakuN);
__int64 GokakuVal = CalcKakusuu(5, GokakuN);
__int64 RokkakuVal = CalcKakusuu(6, RokkakuN);
int cnt = 0;
while (true) {
if (SankakuVal == GokakuVal && SankakuVal == RokkakuVal) {
printf("T%I64d=P%I64d=H%I64d=%I64d\n",SankakuN,GokakuN,RokkakuN,RokkakuVal);
if (++cnt == 2) return;
}
if (min(min(SankakuVal, GokakuVal),RokkakuVal) == SankakuVal) {
SankakuVal = CalcKakusuu(3, ++SankakuN);
continue;
}
if (min(min(SankakuVal, GokakuVal),RokkakuVal) == GokakuVal) {
GokakuVal = CalcKakusuu(5, ++GokakuN);
continue;
}
if (min(min(SankakuVal, GokakuVal),RokkakuVal) == RokkakuVal) {
RokkakuVal = CalcKakusuu(6, ++RokkakuN);
continue;
}
}
}
実行結果
T285=P165=H143=40755
T55385=P31977=H27693=1533776805
解説
minマクロで最小値を求めてます。