C#でプロジェクトオイラーを解く(問題45「三角数, 五角数, 六角数」)

プロジェクトオイラー
Pocket

どーも、みつおです。

問題

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

三角数 Tn=n(n+1)/2 1, 3, 6, 10, 15, …
五角数 Pn=n(3n-1)/2 1, 5, 12, 22, 35, …
六角数 Hn=n(2n-1) 1, 6, 15, 28, 45, …

T285 = P165 = H143 = 40755であることが分かる.

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

出典:Problem45

解答

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Problem45
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Solve());
            Console.ReadLine();
        }

        private static long Solve()
        {
            long ret = 0;
            long cnt = 0;
            long cntsankaku=2, cntgokaku=2, cntrokkaku=2;

            //三角数、五角数、六角数
            long sankaku=3,gokaku=5,rokkaku=6;

            while(true)
            {
                //三角数、五角数、六角数が全て等しい
                if (sankaku == gokaku && sankaku == rokkaku)
                {
                    cnt++;
                    ret = sankaku;
                    if (cnt == 2) break;
                }

                //三角数が最小
                if (sankaku <= gokaku && sankaku <= rokkaku)
                {
                    //三角数を計算
                    sankaku = (cntsankaku * (cntsankaku + 1)) / 2;
                    //三角数の項を増やす
                    cntsankaku++;
                    continue;
                }
                //五角数が最小
                if (gokaku <= sankaku && gokaku <= rokkaku)
                {
                    //五角数を計算
                    gokaku = (cntgokaku * (3 * cntgokaku - 1)) / 2;
                    //五角数の項を増やす
                    cntgokaku++;
                    continue;
                }
                //六角数が最小
                if (rokkaku <= sankaku && rokkaku <= gokaku)
                {   
                    //六角数を計算
                    rokkaku = cntrokkaku * (2 * cntrokkaku - 1);
                    cntrokkaku++;
                    continue;
                }
            }

            return ret;
        }
    }
}

 

出力

1533776805

コメント

タイトルとURLをコピーしました