Project Euler: Problem34

n桁の数と9!*nを比べて、9!*nが追いつけなくなるnをまず見つける。するとnは7だとわかるので、7桁まで探せば十分。

/*
 9!*1  = 362880
 9!*2  = 725760
 ...
 9!*7  = 2540160 (7keta)
 9!*8  = 2903040 (7keta)
*/
object Problem34 {
  def fact(n:int) : int = if (n<=1) 1 else n * fact(n-1)
  def main(args:Array[String]) : unit = {
    var result = 0
    val ls = List(0,1,2,3,4,5,6,7,8,9)
    for (x0<-ls; x1<-ls; x2<-ls; x3<-ls; x4<-ls; x5<-ls; x6<-ls)
      {
	val facts = List(x0,x1,x2,x3,x4,x5,x6).
	  dropWhile(n => n==0).map(fact).foldLeft(0)((n,m) => n+m)
	if (x0*1000000+
	    x1*100000+
	    x2*10000+
	    x3*1000+
	    x4*100+
	    x5*10+
	    x6*1 == facts)
	  {
	    println(facts)
	    result += facts
	  }
      }
    println("Result:",result-(1+2))
  }
}