Project Eulerで使った階乗/約数/過剰数/不足数/完全数/友愛数(親和数)のまとめ
Project Eulerで使ったメソッドをまとめてみました
特にProject Eulerやっている人には便利だと思うのでぜひ使ってみてください。
(コレを使ったらほとんど答えになるので、自分で正解出した後でこんなやり方もあるんだ程度で。。←ツッコミどころ満載です)
require 'mathn' class Integer # 階乗 def fact (1..self).inject(:*) end # 約数 def divisor array = [] self.prime_division.each do |a| a[1].times do array.push(a[0]) end end d = [1, self] 1.upto(array.size - 1) do |n| array.combination(n).to_a.each do |c| d.push(c.inject(:*)) end end d.uniq.sort end # 約数の和(自分自身を除く) def divisor_sum self.divisor.inject(:+) - self end # 完全数 def perfect? self == self.divisor_sum end # 友愛数 def amicable? !self.perfect? && self == self.divisor_sum.divisor_sum end # 過剰数 def abundant? self < self.divisor_sum end # 不足数 def deficient? self > self.divisor_sum end end
使い方
p 6.fact p 6.divisor p 6.divisor_sum p 6.perfect? p 284.amicable? p 12.abundant? p 10.deficient?
出力
720 [1, 2, 3, 6] 6 true true true true