ScalaでProject Euler(95)

Problem 63

この問題はふつうに解くと64ビットの範囲では解けません。多倍長整数を使ってもよいのですが、ここはlogを使いましょう。基数b、指数eに対して題意が成り立つには、

be ≥ 10e-1

logを取って、

e log b ≥ (e - 1)log 10
e log (b / 10) ≥ -log 10
e ≤ log 10 / log (10 / b)

だから、bに対して[log10 / log (10 / b)]個のeがあることになります。実質1行で書けますね。

import scala.math.log

println (Iterator.range(1, 10).map(b => (log(10.0) / log(10.0 / b)).toInt).sum)