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

Cマガ電脳クラブ(第134回) 3乗数の和

問題

1729は、2つの3乗数 (ある数の3乗になっている数) の和で2通りに書ける数の最小のものである。
 1729 = 1の3乗 +12の3乗 = 9の3乗 +10の3乗
では、「2つの3乗数の和で3通りに書ける数の最小のもの」を見つけていただきたい。
なお、ここでは正の整数のみを扱う。


ソース

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

class Program
{
    const int Jyougen = 87540000;

    static void Main()
    {
        int[] SanjyouSuuArr = DeriveSanjyouSuuArr();
        int UB = SanjyouSuuArr.GetUpperBound(0);

        //数式のList[3乗数の和]なDict
        var SumCntDict = new Dictionary<int, List<string>>();
        for (int I = 0; I <= UB; I++) {
            for (int J = I + 1; J <= UB; J++) {
                int wkSum = SanjyouSuuArr[I] + SanjyouSuuArr[J];
                string wkExp = string.Format("{0,8}+{1,8}={2,8}",
                                           SanjyouSuuArr[I], SanjyouSuuArr[J], wkSum);

                if (SumCntDict.ContainsKey(wkSum))
                    SumCntDict[wkSum].Add(wkExp);
                else SumCntDict[wkSum] = new List<string>() { wkExp };
            }
        }
        var AnswerPair = SumCntDict.Where(X => X.Value.Count == 3).OrderBy(X => X.Key).First();
        Console.WriteLine("解は{0}", AnswerPair.Key);
        AnswerPair.Value.ForEach(X => Console.WriteLine(X));
    }

    //3乗数を列挙
    static int[] DeriveSanjyouSuuArr()
    {
        var SanjyouSuuList = new List<int>();
        for (int I = 1; I * I * I <= Jyougen; I++) {
            SanjyouSuuList.Add(I * I * I);
        }
        return SanjyouSuuList.ToArray();
    }
}


実行結果

解は87539319
 4657463+82881856=87539319
11852352+75686967=87539319
16581375+70957944=87539319


解説

87540000以下の3乗数を列挙し、
3乗数のペアの和を列挙してます。

解は、87539319で
87540000以下の3乗数のペアの和を列挙してますので、
題意を満たしてます。