problem 56

Problem 56 - Project Euler

a < 100,b < 100 のとき a^b の各桁の数字の和の最大値を求める問題。

100^100 が普通に計算できるので簡単です。

; 1234 -> 10
(define (sum-digits num)
  (let loop ((r 0)
             (n num))
    (if (= n 0)
      r
      (loop (+ r (modulo n 10))
            (quotient n 10)))))

(define (p56)
  (let loop ((a 1)
             (b 1)
             (r 0))
    (if (= a 101)
      r
      (loop (if (= b 100) (+ a 1) a)
            (if (= b 100) 1 (+ b 1))
            (max r (sum-digits (expt a b)))))))

(print (p56))