問題
Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide
evenly into n).
If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of
a and b are called amicable numbers.
For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110;
therefore d(220) = 284.
The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
Evaluate the sum of all the amicable numbers under 10000.
ソース
require 'mathn'
class Integer
def divisor_sum
array = []
self.prime_division.each do |a|
a[1].times do
array.push(a[0])
end
end
count = [1]
1.upto(array.size - 1) do |n|
array.combination(n).to_a.each do |c|
count.push(c.inject(:*))
end
end
count.uniq.inject(:+)
end
end
puts (1...10000).inject(0) {|s, i|
s + (i != (d = i.divisor_sum) && i == d.divisor_sum ? i : 0)
}
感想
友愛数(amicable numbers)の定義ではまった。。。
Wikipedia*1で調べると完全数を含まないので、6, 28, 496, 8128は友愛数ではない。。
ちゃんと問題に書いてよ〜〜〜〜〜〜