私はプログラミングの練習として、ProjectEulerをやっています。Write Code Everydayのネタとして使っている方もいます。今後挑戦する方のために、始め方をまとめておきます。
#ProjectEulerについて
数学の問題をプログラミングで解いていきます。現在は631問あります(2018/10/31)。使用する言語に制限はありません。数学の知識が必要となり(私は調べながらやっています)、問題を進むごとに難しくなっていきます。アルゴリズムを工夫せずに書くと計算量が多くなり長時間実行が終わらなくなることもあります。効率よく、簡潔に正解を導けるアルゴリズムを考える練習になります。
#Project Eulerの始め方
会員登録をしなくても問題を見ることができますが、会員登録をすると1問ずつ答え合わせができ、その問題についてのフォーラムを見ることができます(英語ですが……)。また、自分がどこまで解いたかの状況も確認でき、実績制度もあります。
まず、公式サイトにアクセスします。
ProjectEuler公式
https://projecteuler.net/
画面右上の「Register」をクリックし、Username,Password,Confirm Passwordを入力し登録します。
登録後サインインして、「Archives」をクリックすると、1問目からの問題リストが開きます。
問題は英語なので、日本語訳は以下のサイトを参考にしてください。
http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler
挑戦する問題を開いて、自分が選択した言語で答えを導きましょう。答えが導けたら、問題のページに入力し答え合わせしましょう。答えがあっているとDifficultyの横のチェックマークがつきます。
#1問目
1問目はこのような問題です。
「10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ」
例として答えを乗せておきます。私はC#でやっているので、このようになりました。
{
var Sum = 0;
for (int i = 0; i < 1000; i++)
{
if (i % 3 == 0 || i % 5 == 0) Sum += i;
}
label1.Text = "Answer = " + Sum.ToString();
}
この方法では、答えをラベルに表示させてます。
簡単だと思ったかもしれませんが、2問目は「フィボナッチ数列の項の値が400万以下の, 偶数値の項の総和を求めよ」、3問目は「600851475143 の素因数のうち最大のものを求めよ」ですので、アルゴリズムは思いつくけれどもいかに計算量を減らすかということを考えることになります。
#終わりに
私は計算時間が長くかかってもいいから答えを出せるようにしています。難しいですが、
アルゴリズムを考える練習になります。やってみようと思った方はぜひやってみてください。自分の好きな言語で挑戦できるので力試しにも勉強にも使えます。こだわりがなければ、pythonが楽だと思います。