トップページに戻る
次の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で分析関数が使えるといいですね :-)