はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudioで、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
2問目
フィボナッチ数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
long Sum = 2;
int[] Fibonacci;
Fibonacci = new int[100];
Fibonacci[1] = 1;
Fibonacci[2] = 2;
for (int i = 3; i < 100; i++)
{
Fibonacci[i] = Fibonacci[i - 2] + Fibonacci[i - 1];
if (Fibonacci[i] > 4000000) break;
if (Fibonacci[i] % 2 == 0)
{
Sum += Fibonacci[i];
}
}
label1.Text = "Answer = " + Sum;
配列を宣言して順番にフィボナッチ数列を格納する方法を用いました。ですが、よりスマートなコードにする方法はあります。例えば、再帰呼び出しを使うと前の結果を保存しなくても結果を出すことができます。いろいろ考えてみてください。
3問目
600851475143 の素因数のうち最大のものを求めよ.
var Number = 600851475143;
var i = 2;
while (i < Number)
{
if (Number % i == 0)
{
Number /= i;
}
else { i++; }
}
if (Number < i) { Number = i; }
string Answer = Number.ToString();
label1.Text = "Answer= " + Answer;
600851475143を2,3,4,...と順に割れるだけ割って、割り切れた数字と最後に残った数字を比べて大きいものを答えとしました。最後に残った数字が大きい可能性もあるため、比較する必要があります。
4問目
3桁の2数の積で,回文になる最大のものを求めよ.
var Max = 0;
var Element1 = 0;
var Element2 = 0;
for (int i = 100; i < 1000; i++)
{
for (int j = 100; j < 1000; j++)
{
int Number = i * j;
string NumberString = Number.ToString();
string ReverseString = new string(NumberString.Reverse().ToArray());
if (ReverseString == NumberString)
{
if (Max < Number)
{
Max = Number;
Element1 = i;
Element2 = j;
}
}
}
}
label1.Text = "Answer= " + Element1 + "X" + Element2 + " = " + Max;
3桁の数字の掛け算に関して全通り試しています。文字列の反転に関して少し詰まりました。Reverse()メソッドが使えなかったのですが、new stringとToArray()して配列扱いにしてから文字列にすることで使うことができました。
おわりに
私はC言語を学生時代に少しやった程度ですが、C#も基本的にはC言語の経験があれば多少はできるということが分かりました。しかし、進めていくなかでプログラミングの基本を案外忘れているものだと感じました。錆び付かないよう、勉強していこうと思います。