Problem 63 - n乗してn桁
落ち着いて範囲を考える。
n乗してn桁になる数はいくつあるか。
ふむふむ。適当に計算してみる。
まず終端。
10^1は2桁,10^2は3桁,10^3は4桁・・・となるので、10^nはn乗するとn+1桁。絶対に追いつかない。
10以上は除外できる。
小さいループを。
1^1 1桁 OK。1^2 1桁 ダメ。
2^1 1桁 OK。2^2 1桁 ダメ。
..
4^1 1桁 OK。4^2 2桁 OK。4^3 2桁 ダメ。
...
どうやら1桁目から順に解いていけばいいみたいだ。桁が下回ったら追いつけない。
ということで、
(define (problem63) (letrec ((iter (lambda (a n) (cond ((= a 10) 0) ((= (string-length (number->string (expt a n))) n) (+ 1 (iter a (+ n 1)))) (else (iter (+ a 1) 1)))))) (iter 1 1))) (problem63) ; 49
簡単!