左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.
では, 3桁の数の積で表される回文数の最大値を求めよ.
補助的な手続きをいくつか定義して問題を解きます.
- 整数の各桁を取り出す手続きを定義する.
- リストが回文になっていることを判定する手続きを定義する.
- 3桁の整数のリストを2つ作り, すべての組合せの積を求める.
- その積から最大のものを見つける.
補助手続きは次のようになります.
(require srfi/1) (define (decimal-format nbr) (define (loop ans n) (if (= 0 n) ans (loop (cons (remainder n 10) ans) (quotient n 10)))) (loop () nbr)) (define (palindromic? nbr) (let ((dec (decimal-format nbr))) (equal? dec (reverse dec))))
方針に従って計算した結果は次のようになります.
ようこそ DrRacket, バージョン 5.3.3 [3m]. 言語: Pretty Big; memory limit: 512 MB. > (sort (apply append (filter (lambda (lst) (not (equal? lst ()))) (map (lambda (n) (filter (lambda (a) (palindromic? (car a))) (map (lambda (i) (list (* i n) i n)) (iota 900 100)))) (iota 900 100)))) (lambda (a b) (< (car a) (car b)))) ((10201 101 101) (11211 111 101) (11211 101 111) (12221 121 101) (12221 101 121) (12321 111 111) (13231 131 101) (13231 101 131) ..... 省略 ..... (886688 968 916) (886688 916 968) (888888 962 924) (888888 924 962) (906609 993 913) (906609 913 993)) >
0 件のコメント:
コメントを投稿