トップページに戻る    次の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角数な数を求めよ.


ソース

using System;

class Program
{
    static long CalcKakusuu(long pNankaku, long N)
    {
        if (pNankaku == 3) return N * (N + 1) / 2;
        if (pNankaku == 5) return N * (3 * N - 1) / 2;
        return N * (2 * N - 1);
    }

    static void Main()
    {
        long SankakuN = 2;
        long GokakuN = 2;
        long RokkakuN = 2;
        long SankakuVal = CalcKakusuu(3, SankakuN);
        long GokakuVal = CalcKakusuu(5, GokakuN);
        long RokkakuVal = CalcKakusuu(6, RokkakuN);

        int cnt = 0;
        while (true) {

            if (SankakuVal == GokakuVal && SankakuVal == RokkakuVal) {
                Console.WriteLine("T{0}=P{1}=H{2}={3}", SankakuN, GokakuN, RokkakuN, RokkakuVal);
                if (++cnt == 2) return;
            }

            if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == SankakuVal) {
                SankakuVal = CalcKakusuu(3, ++SankakuN);
                continue;
            }
            if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == GokakuVal) {
                GokakuVal = CalcKakusuu(5, ++GokakuN);
                continue;
            }
            if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == RokkakuVal) {
                RokkakuVal = CalcKakusuu(6, ++RokkakuN);
                continue;
            }
        }
    }
}


実行結果

T285=P165=H143=40755
T55385=P31977=H27693=1533776805


解説

最小の角数の、次の角数を順に求めてます。