トップページに戻る    次の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マクロで最小値を求めてます。