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
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
【国産】アイシング用コルネ三角シート【シール付】150×150《100枚》
- 出版社/メーカー: アート・エム
- メディア: ホーム&キッチン
- この商品を含むブログを見る