トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Cマガ電脳クラブ(第070回) 三乗の参上
問題
下記のA〜Hにそれぞれ違った数を入れて、式として正しく成り立つようにしたい。
答えはいくつもあるので、それぞれの差、つまりXがいちばん小さくなるものを見つけることにする。
ただし、A〜H、そしてXも、すべて正の整数でなければならない。
Aの3乗 - Bの3乗 = Cの3乗 - Dの3乗 = Eの3乗 - Fの3乗 = Gの3乗 - Hの3乗 = X
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
const int Jyougen = 1200; //21億の3乗根は、約1280
struct ResultDef
{
internal int A;
internal int B;
internal int X;
}
static void Main()
{
var ResultList = new List<ResultDef>();
for (int LoopA = 2; LoopA <= Jyougen; LoopA++) {
for (int LoopB = LoopA - 1; 1 <= LoopB; LoopB--) {
ResultDef WillAdd;
WillAdd.A = LoopA;
WillAdd.B = LoopB;
WillAdd.X = LoopA * LoopA * LoopA - LoopB * LoopB * LoopB;
ResultList.Add(WillAdd);
}
}
Console.WriteLine("Aの上限={0}とします。", Jyougen);
const int wkDiff = Jyougen * Jyougen * Jyougen
- (Jyougen - 1) * (Jyougen - 1) * (Jyougen - 1);
Console.WriteLine("{0}の3乗 - {1}の3乗 = {2} で、", Jyougen, Jyougen - 1, wkDiff);
Console.WriteLine("Xが{0}以下となる解があるか検証します。", wkDiff);
Console.WriteLine();
var Query = ResultList.GroupBy(I => I.X).Where(I => I.Count() >= 4);
foreach (var AnyKey in Query.OrderByDescending(I => I.Key)) {
foreach (var AnyElement in AnyKey.OrderBy(I => I.A)) {
Console.WriteLine("A={0,3} , B={1,3} , X={2,7}",
AnyElement.A, AnyElement.B, AnyElement.X);
}
}
}
}
実行結果
Aの上限=1200とします。
1200の3乗 - 1199の3乗 = 4316401 で、
Xが4316401以下となる解があるか検証します。
A=162 , B= 51 , X=4118877
A=165 , B= 72 , X=4118877
A=178 , B=115 , X=4118877
A=678 , B=675 , X=4118877
解説
9^3-8^3=217,9^3-7^3=386,9^3-6^3=513,9^3-5^3=604,9^3-4^3=665,9^3-3^3=702,9^3-2^3=721,9^3-1^3=728,
8^3-7^3=169,8^3-6^3=296,8^3-5^3=387,8^3-4^3=448,8^3-3^3=485,8^3-2^3=504,8^3-1^3=511,
7^3-6^3=127,7^3-5^3=218,7^3-4^3=279,7^3-3^3=316,7^3-2^3=335,7^3-1^3=342,
6^3-5^3= 91,6^3-4^3=152,6^3-3^3=189,6^3-2^3=208,6^3-1^3=215,
5^3-4^3= 61,5^3-3^3= 98,5^3-2^3=117,5^3-1^3=124,
4^3-3^3= 37,4^3-2^3= 56,4^3-1^3= 63,
3^3-2^3= 19,3^3-1^3= 26,
2^3-1^3= 7,
なので
7^3-6^3=127から見れば、8^3および9^3から生成されるXは、全て127より大きいので、
127を上限として、127以下のXが解になりうるかを検証し、解が見つかるか調べるといった方法で、
上限を試行錯誤してます。