トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem62 桁の置換をちょうど5つもつ最小の立方数
問題
立方数 41063625は, 桁の順番を入れ替えると2つの立方数になる:
56623104と 66430125である.
41063625は, 立方数になるような桁の置換をちょうど3つもつ最小の立方数である.
立方数になるような桁の置換をちょうど5つもつ最小の立方数を求めよ.
ソース
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
const int BaseJyougen = 10000;
//const int Kosuu = 3;
const int Kosuu = 5;
static void Main()
{
long[] SanjyouArr = Enumerable.Range(1, BaseJyougen).Select(X => (long)X * X * X).ToArray();
Console.WriteLine("{0}の立方である、", BaseJyougen);
Console.WriteLine("{0}を立方数の上限として検証します。", SanjyouArr[BaseJyougen - 1]);
Console.WriteLine();
for (int I = 0; I <= SanjyouArr.GetUpperBound(0); I++) {
var sb1 = new StringBuilder();
foreach (char Each in SanjyouArr[I].ToString().OrderBy(X => X))
sb1.Append(Each);
var AnswerList = new List<int>() { I };
int Cnt = 1;
for (int J = I + 1; J <= SanjyouArr.GetUpperBound(0); J++) {
//桁数が異なる場合
if (sb1.ToString().Length > SanjyouArr[J].ToString().Length) continue;
if (sb1.ToString().Length < SanjyouArr[J].ToString().Length) break;
var sb2 = new StringBuilder();
foreach (char Each in SanjyouArr[J].ToString().OrderBy(X => X))
sb2.Append(Each);
if (sb1.ToString().Equals(sb2.ToString())) {
AnswerList.Add(J);
if (++Cnt > Kosuu) break;
}
}
if (Cnt == Kosuu) {
Console.WriteLine("Answer={0}", SanjyouArr[I]);
Console.WriteLine("立方数の組み合わせは");
AnswerList.ForEach(X => Console.WriteLine("{0}({1}の3乗)",
(long)(X + 1) * (X + 1) * (X + 1), (X + 1)));
return;
}
}
}
}
実行結果
10000の立方である、
1000000000000を立方数の上限として検証します。
Answer=127035954683
立方数の組み合わせは
127035954683(5027の3乗)
352045367981(7061の3乗)
373559126408(7202の3乗)
569310543872(8288の3乗)
589323567104(8384の3乗)
解説
立方数の上限を、1000000000000として、
求まった立方数の組み合わせが、全て1000000000000以下ですので
題意を満たしてます。