C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
62問目
立方数
41063625 (345^3)
は, 桁の順番を入れ替えると2つの立方数になる:
56623104 (384^3) , 66430125 (405^3)
である. 41063625は, 立方数になるような桁の置換をちょうど3つもつ最小の立方数である.
立方数になるような桁の置換をちょうど5つもつ最小の立方数を求めよ.
private void button62_Click(object sender, EventArgs e)
{
const int Max = 10000;
const int MaxCount = 5;
long[] CubeArray = Enumerable.Range(1, Max).Select(X => (long)X * X * X).ToArray();
for (int i = 0; i <= CubeArray.GetUpperBound(0); i++)
{
var sb1 = new StringBuilder();
foreach (char Each in CubeArray[i].ToString().OrderBy(X => X))
sb1.Append(Each);
var AnswerList = new List<int>() { i };
int Cnt = 1;
for (int j = i + 1; j <= CubeArray.GetUpperBound(0); j++)
{
if (sb1.ToString().Length > CubeArray[j].ToString().Length) continue;
if (sb1.ToString().Length < CubeArray[j].ToString().Length) break;
var sb2 = new StringBuilder();
foreach (char Each in CubeArray[j].ToString().OrderBy(X => X))
sb2.Append(Each);
if (sb1.ToString().Equals(sb2.ToString()))
{
AnswerList.Add(j);
if (++Cnt > MaxCount) break;
}
}
if (Cnt == MaxCount)
{
AnswerList.ForEach(X => textBox1.AppendText((X + 1) + "の立方" + (long)(X + 1) * (X + 1) * (X + 1) + " "));
label1.Text = "Answer =" + CubeArray[i].ToString();
return;
}
}
}
2つの立方数を計算するループで、桁の順番を入れ替えて他の立方数になるということは、昇順で並べ替えたときに同じなので、昇順で並び替えて5つ等しいものが見つかると終了という仕組みです。
感想
かなり調べたので、自分の力で解けるように努力します