ScalaでProject Euler(30)

Problem 15

多倍長整数を使えば簡単です。

def sum_digits(n :BigInt) :Int =
    if(n == 0) 0 else (n % 10).toInt + sum_digits(n / 10)

val N = 1000
val n = (1 to N).foldLeft(BigInt(1))((x, y) => x * 2)
println (sum_digits(n))

しかし、使わなくても簡単です。1桁ずつリストにすればよいでしょう。2倍を繰り返すだけなので単純なコードになります。

def twice(a :List[Int], carry :Int = 0) :List[Int] = a match {
    case Nil => if(carry == 0) Nil else List(carry)
    case d :: tail => {
        val m = d * 2 + carry
        (m % 10) :: twice(tail, m / 10)
    }
}

val N = 1000
val a = (1 to N).foldLeft(List(1))((x, y) => twice(x))
println (a.sum)