トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem45 3角数かつ5角数かつ6角数な数
問題
3角数, 5角数, 6角数は以下のように生成される.
3角数 Tn=n(n+1)/2 1, 3, 6, 10, 15, ...
5角数 Pn=n(3n-1)/2 1, 5, 12, 22, 35, ...
6角数 Hn=n(2n-1) 1, 6, 15, 28, 45, ...
T285 = P165 = H143 = 40755であることが分かる.
次の3角数かつ5角数かつ6角数な数を求めよ.
ソース
using System;
class Program
{
static long CalcKakusuu(long pNankaku, long N)
{
if (pNankaku == 3) return N * (N + 1) / 2;
if (pNankaku == 5) return N * (3 * N - 1) / 2;
return N * (2 * N - 1);
}
static void Main()
{
long SankakuN = 2;
long GokakuN = 2;
long RokkakuN = 2;
long SankakuVal = CalcKakusuu(3, SankakuN);
long GokakuVal = CalcKakusuu(5, GokakuN);
long RokkakuVal = CalcKakusuu(6, RokkakuN);
int cnt = 0;
while (true) {
if (SankakuVal == GokakuVal && SankakuVal == RokkakuVal) {
Console.WriteLine("T{0}=P{1}=H{2}={3}", SankakuN, GokakuN, RokkakuN, RokkakuVal);
if (++cnt == 2) return;
}
if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == SankakuVal) {
SankakuVal = CalcKakusuu(3, ++SankakuN);
continue;
}
if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == GokakuVal) {
GokakuVal = CalcKakusuu(5, ++GokakuN);
continue;
}
if (Math.Min(Math.Min(SankakuVal, GokakuVal), RokkakuVal) == RokkakuVal) {
RokkakuVal = CalcKakusuu(6, ++RokkakuN);
continue;
}
}
}
}
実行結果
T285=P165=H143=40755
T55385=P31977=H27693=1533776805
解説
最小の角数の、次の角数を順に求めてます。