以下の内容はhttps://inamori.hateblo.jp/entry/20110709/p1より取得しました。


ScalaでProject Euler(41)

Problem 24

この問題は答えを出すだけなら手計算レベルです。階乗で割っていって余りを求めるだけです。ただ、関数型らしく書いたらややこしくなってしまったので、var使いまくりで書いてみました。

def factorial(n :Int) =
    (1 to n).foldLeft(1)(_ * _)

def pop(a :List[Int], k:Int) :(Int,List[Int]) =
    if(k == 0)
        (a.head, a.tail)
    else {
        val (m, xs) = pop(a.tail, k - 1)
        (m, a.head :: xs)
    }

class IterDigits(N :Int) extends Iterator[Int] {
    var r = N - 1
    var n = 9
    var a = List.range(0, 10)
    
    def hasNext() = n >= 0
    
    def next() = {
        val f = factorial(n)
        val k = r / f
        r = r % f
        val (m, b) = pop(a, k)
        a = b
        n -= 1
        m
    }
}

val N = 1e6.toInt
println ((new IterDigits(N)).foldLeft(0L)(_ * 10 + _))



以上の内容はhttps://inamori.hateblo.jp/entry/20110709/p1より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14