2012年6月9日土曜日

Project Euler-Problem12をgroovyで解いてみる

問題

三角数の数列は自然数の和で表わされ、7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である。 三角数の最初の10項は

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
となる。

最初の7項について、その約数を列挙すると、以下のとおり。

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

これから、7番目の三角数である28は、6個以上の約数をもつ最初の三角数であることが分る。
では、501 個以上の約数をもつ最初の三角数はいくらか。

問題を解いたプログラム

def getAliquot(def num) {
  def results = (1..Math.sqrt(num)).findResults {
    if (num % it == 0) {
      it
    }
  }
  results.size() * 2
}

def num = 1
def triangularNumbers = num
while (getAliquot(triangularNumbers) <= 500){
  num++
  triangularNumbers += num
}

println "num = ${triangularNumbers}"