10000までの完全数を列挙せよ
エラトステネスの篩もよいけれど、別の問題もやろうよ。ということで「完全数」です。
def perfect(n = 100, &block) sum = Array.new(n + 1, 1) (2..n).each do |i| if i == sum[i] block.call(i) end k = i + i while k <= n sum[k] += i k += i end end sum end perfect(10000) do |k| print "#{k}, " end #=> 6, 28, 496, 8128,
あらら? エラトステネスの篩とほぼ同じになっちゃった♪
追記:おお、Danさんが反応してくださいました。感謝です♪