トップページに戻る    次の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が解になりうるかを検証し、解が見つかるか調べるといった方法で、
上限を試行錯誤してます。