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

Cマガ電脳クラブ(第151回) 2組の5乗数の和

問題

650033は、3つの4乗数の和で2通りに表せる。4乗数とは、ある整数を4乗して得られる数のことである。
650033 = 11の4乗 + 12の4乗 + 28の4乗 = 14の4乗 + 23の4乗 + 24の4乗
このような「3つの4乗数の和で2通りに表せる数」はほかにもたくさんある。
では、「3つの5乗数の和で2通りに表せる数」を1つ見つけていただきたい。
なお、ここでは正の数のみを扱うこととする。


ソース

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

class Program
{
    const long Jyougen = 1380000000;

    static void Main()
    {
        long[] GojyouSuuArr = DeriveGojyouSuuArr();
        int UB = GojyouSuuArr.GetUpperBound(0);

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

                    if (SumCntDict.ContainsKey(wkSum))
                        SumCntDict[wkSum].Add(wkExp);
                    else SumCntDict[wkSum] = new List<string>() { wkExp };
                }
            }
        }
        var AnswerPairEnum = SumCntDict.Where(X => X.Value.Count == 2).OrderBy(X => X.Key);
        int AnswerCnt = 0;
        foreach (var EachAnswerPair in AnswerPairEnum) {
            Console.WriteLine("解{0}は、{1}", ++AnswerCnt, EachAnswerPair.Key);
            EachAnswerPair.Value.ForEach(X => Console.WriteLine(X));
        }
    }

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


実行結果

解1は、1375298099
       243+ 459165024+ 916132832=1375298099
   7962624+  17210368+1350125107=1375298099
解2は、1419138368
    371293+ 345025251+1073741824=1419138368
   1889568+ 164916224+1252332576=1419138368


解説

上限を決めて、5乗数を列挙し、全探索してます。