トップページに戻る    次の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以下ですので
題意を満たしてます。