トップページに戻る
次の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乗数を列挙し、全探索してます。