ScalaでProject Euler(18)

Problem 10

この問題はエラトステネスのふるいですね。ScalaではArrayを使うとよいと思います。配列ですね。

val a = new Array[Int](5)
for(i <- 0 to 4) a(i) = i + 1
println (a(1))      // 2
println (a.toList)  // List(1, 2, 3, 4, 5)

[]の代わりに()を使うくらいですね。簡単です。

def sieve(N :Int) = {
    val a = new Array[Boolean](N)
    for(n <- 2 to (N - 1)) a(n) = true
    for(p <- 2 to (N - 1) if a(p); m <- (p * 2) to (N - 1) by p)
        a(m) = false
    
    (2 to (N - 1)).filter(a(_))
}

val N = 2e6.toInt
println (sieve(N).map(_.toLong).sum)

ところで、上を2e7までにしたらJVM抜きで120MB以上メモリを食っていました。BooleanをIntにしたら170MB以上。理屈はよくわからないけど、Scalaは(Javaは?)相当なメモリ食い虫のようですね。