Project Euler : Problem 45 『Triangular, pentagonal, and hexagonal』

数の悪魔―算数・数学が楽しくなる12夜

問題

projecteuler.net
日本語訳→Problem 45 - PukiWiki


3つの数が揃う時を探す

3つの数をいっぺんに比較して調べようとするとややこしいので、
1)三角数と五角数が同じ数字になる項を探す
2)見つかったら五角数と六角数が同じ数字になる項を探す
3-1)五角数と六角数が同じ数字になるなら、三角数も同じ数字なので値を出力
3-2)五角数と六角数が同じ数字にならない(見つからない)なら、(1)に戻る
大体こんな感じ。
式といた方が早いっていう人もいると思う。


コード
using System;
using System.Diagnostics;

namespace Problem45
{
    class Program
    {
        static void Main(string[] args)
        {
            P45 p = new P45();

            Debug.WriteLine(p.Solve());
        }
    }

    class P45
    {
        //インデックス値
        Int64 ti;
        Int64 pi;
        Int64 hi;
        //値
        Int64 tn;
        Int64 pn;
        Int64 hn;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public P45()
        {
            ti = 286;
            pi = 166;
            hi = 144;
            tn = this.TriangleNumber(ti);
            pn = this.PentagonalNumber(pi);
            hn = this.HexagonalNumber(hi);
        }

        /// <summary>
        /// 解く
        /// </summary>
        /// <returns></returns>
        public Int64 Solve()
        {

            while (true)
            {
                //まず三角数 == 五角数を目指す 
                if (tn < pn)
                {
                    ti++;
                    tn = this.TriangleNumber(ti);
                }
                else if (tn > pn)
                {
                    pi++;
                    pn = this.PentagonalNumber(pi);
                }
                else
                {
                    //次に五角数==六角数になるか調べる
                    while (true)
                    {
                        if (pn > hn)
                        {
                            hi++;
                            hn = this.HexagonalNumber(hi);
                        }
                        else if (pn < hn)
                        {
                            //六角数の方が五角数より大きくなった場合、
                            //五角数の項を+1して再び三角数==五角数を調べる
                            pi++;
                            pn = this.PentagonalNumber(pi);
                            break;
                        }
                        else return hn;
                    }
                }
            }
        }

        /// <summary>
        /// 三角数を求める
        /// </summary>
        /// <param name="n">インデックス</param>
        /// <returns></returns>
        private Int64 TriangleNumber(Int64 n)
        {
            return (n * (n + 1)) / 2;
        }

        /// <summary>
        /// 五角数を求める
        /// </summary>
        /// <param name="n">インデックス</param>
        /// <returns></returns>
        private Int64 PentagonalNumber(Int64 n)
        {
            return (n * (3 * n - 1)) / 2;
        }

        /// <summary>
        /// 六角数を求める
        /// </summary>
        /// <param name="n">インデックス</param>
        /// <returns></returns>
        private Int64 HexagonalNumber(Int64 n)
        {
            return n * (2 * n - 1);
        }

    }
}
答え

1533776805
こんなに大きい数字になるとは思わなかったのでint型でやって時間食った。



Clover 三角目数リング S 55-761

Clover 三角目数リング S 55-761