問題
-
Find the largest palindrome made from the product of two 3-digit numbers.
-
3桁の数の積で表される回文数のうち最大のものはいくらになるか。
解答
3桁の数値なので、考えられる項は100 .. 999です。つまりナイーブな実装では、900 * 900 = 810,000回の乗算を行う必要があります。これは不可能な大きさではありません。というより私がまともな解法を思いつかないので、今回はこれで。
まず回文数かどうか判定する述語を作ります。palindromic-number?
という関数がそれです。やっていることは単純で、数値を文字列に変換した上で反転したものと比較しているだけです。文字列の反転はSRFI-13のstring-reverse
で可能です。
実際には文字列の前半と、反転させた後半のみを比較すれば良いのですが、文字列を切り出すコストの方が高いのでそのまま比較しています。
実際の探索を行っているsolve
は単純で、すべての積を計算した上で、その中から回文数をSRFI-1のfilter
で抽出してリストpalins
とし、そこからmax
で最大値を選び出します。
簡単な最適化として、例えば100 * 101と101 * 100は同じなので、無駄な計算を省くために100 <= i <= j <= 999が常に成り立つように内側のmap
に渡すリストを工夫しています。これによって乗算の回数をおよそ半分にできます。
これまでの問題がミリ秒単位で計算できたのに比べると今回のプログラムは時間がかかりますが、数秒で計算できると思います。
(use srfi-1)
(use srfi-13)
(define (palindromic-number? n)
(define n-str (number->string n))
(string=? n-str (string-reverse n-str)))
(define (solve)
(define palins
(filter palindromic-number?
(apply append
(map (lambda (i)
(map (lambda (j) (* i j)) (iota (- 1000 i) i)))
(iota 900 100)))))
(apply max palins))
(define (main argv)
(display (solve))
(newline))
コメント
コメントを投稿