トップページに戻る
次の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乗数のペアの和を列挙してますので、
題意を満たしてます。