2012年7月21日土曜日

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

問題

d(n)をnの真の約数の和と定義する。(真の約数とはn以外の約数のことである。)
もし、d(a) = b かつ d(b) = a (a ≠ b)を満たすとき、aとbは友愛数(親和数)であるという。

例えば、220の約数は1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110なのでd(220) = 284である。
また、284の約数は1, 2, 4, 71, 142なのでd(284) = 220である。

それでは10000未満の友愛数の合計を求めよ。

問題を解いたプログラム

def getSumAliquot(def num) {
  (1..(num / 2)).findAll {num % it == 0}.sum()
}

println((1..<10000).sum {
  def aliquot = getSumAliquot(it)
  it != aliquot && it == getSumAliquot(aliquot) ? aliquot : 0
})