Problem 56 - Project Euler

mzp2008-07-05

30分プログラム、その333。Problem56 - ProjectEuler

Googol (10100)は非常に大きな数である: 1の後に0が100個続く. 100100は想像を絶する. 1の後に0が200回続く. その大きさにも関わらず, 両者とも桁の和は1である.
a, b < 100について自然数abを考える. 桁の和の最大を答えよ.

最近、数字を桁ごとに分解する問題が多い気がする。
特に何事もなくあっさり解けた。

使い方

gosh> (solve 100)
972

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; problem56.scm -
;;
;; Copyright(C) 2008 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2008/07/06 00:36:21
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(use srfi-1)

(define (int->list n)
  (if (= 0 n)
      '()
      (cons (modulo n 10)
	    (int->list (quotient n 10)))))

(define (map2 f xs ys)
  (append-map (lambda (y) (map (cut f <> y) xs))
	      ys))

(define (solve n)
  (let1 xs (iota (- n 1) 1)
    (apply max (map2 (lambda (a b) 
		       (apply + (int->list (expt a b))))
		     xs xs))))