2014年6月30日月曜日

[Project Euler] Problem 30 「各桁の5乗」

驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.
1634 = 14 + 64 + 34 + 44
8208 = 84 + 24 + 04 + 84
9474 = 94 + 44 + 74 + 44
ただし, 1=14は含まないものとする.

この数たちの和は 1634 + 8208 + 9474 = 19316 である.

各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.
95は59049ですから, 対象となる数の30万を超えることはありません.
  1. 2から30万までの整数のリストを作る.
  2. 各桁を5乗した結果の和を求める.
  3. 元の数と和が一致するものだけを残す.
手続きは次のようになります.
(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 (digit-fifth-powers n)
  (fold + 0 (map (lambda (x) (* x x x x x)) (decimal-format n))))
計算してみます.
ようこそ DrRacket, バージョン 5.3.3 [3m].
言語: Pretty Big; memory limit: 2048 MB.
443839
> (filter (lambda (n) (= n (digit-fifth-powers n)))
          (iota 300000 2))
(4150 4151 54748 92727 93084 194979)
> (+ 4150 4151 54748 92727 93084 194979)
443839
> 

0 件のコメント:

コメントを投稿