Project Euler を始めてみた
About - Project Euler
プログラムして解いていく,数学の問題集.数学の問題といっても,必要なのはほとんどひらめきだけで,定理や定石などは必要ない.力押しでも解けるけれど,美しい解法も必ずあります,と思われる問題が並んでいて,久々に頑張って考えてしまった.
例えば,Problem 5 はこんな問題
What is the smallest number divisible by each of the numbers 1 to 20?
和訳: 1から20までのいずれの整数でも割りきれる整数で最小のものは?
それぞれの整数を素因数分解して,必要最小限な素因数を求めれば解けるけれど,それはちょっとなあ,という感じ.
自分は,以下のように解いてみた.
#include <stdio.h> int main(int argc, char** argv) { const int TARGET = 20; int factor[TARGET+1]; int ans = 1; for (int i = 2; i <= TARGET; ++i) { factor[i] = i; for (int j = 2; j < i; ++j) if (factor[i] % factor[j] == 0) factor[i] /= factor[j]; ans *= factor[i]; } printf("answer = %d\n", ans); return 0; }
まあ結局,素因数分解みたいなことはしているのですが.なかなかシンプルに書けたのではないかと自画自賛.
サイトでは他の人々の解答も見られるのだけれど,これがまたすごい.「なるほど賢い」と唸ってしまう解答,知らない言語で読めないけれど異常なほど短い解答,などなど.一つの問題で二度楽しめる.
この後も,楽しみながらコツコツやっていきたいと思う.