トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem39 和が1000未満のピタゴラス数

問題

辺の長さが{a,b,c}と整数の3つ組である直角三角形を考え,
その周囲の長さをpとする. p = 120のときには3つの解が存在する:

{20,48,52}, {24,45,51}, {30,40,50}
p <= 1000 で解の数が最大になるpを求めよ.


ソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    struct AnswerStruct
    {
        internal int P;
        internal string Answer;
    }

    static void Main()
    {
        var AnsList = new List<AnswerStruct>();
        for (int P = 1; P <= 1000; P++) {
            for (int A = 1; A <= P; A++) {
                for (int B = A; B <= P; B++) {
                    if (A + B > P) break;
                    int C = P - A - B;
                    if (A * A + B * B != C * C) continue;

                    AnswerStruct WillAdd;
                    WillAdd.P = P;
                    WillAdd.Answer = String.Format("{0},{1},{2}", A, B, C);
                    AnsList.Add(WillAdd);
                }
            }
        }

        var Query = AnsList.GroupBy(X => X.P)
                           .Select(X => new { X.Key, cnt = X.Count() })
                           .OrderByDescending(X => X.cnt).Take(15);
        foreach (var Each in Query)
            Console.WriteLine(Each);
    }
}


実行結果

{ Key = 840, cnt = 8 }
{ Key = 720, cnt = 6 }
{ Key = 420, cnt = 5 }
{ Key = 660, cnt = 5 }
{ Key = 924, cnt = 5 }
{ Key = 240, cnt = 4 }
{ Key = 360, cnt = 4 }
{ Key = 480, cnt = 4 }
{ Key = 504, cnt = 4 }
{ Key = 630, cnt = 4 }
{ Key = 672, cnt = 4 }
{ Key = 756, cnt = 4 }
{ Key = 780, cnt = 4 }
{ Key = 900, cnt = 4 }
{ Key = 960, cnt = 4 }


解説

LINQのOrderBy拡張メソッドで、相関サブクエリを使うのも悪くないかもしれません。
LINQで分析関数が使えるといいですね :-)