Coding Dojo - Amicable_Pair by Ruby English Posting

def sum_of_divisors(num)
  divisors = [1]
  (2..Math::sqrt(num)).each do |e|
    if num % e == 0
      divisors << e
      divisors << num / e
    end
  end
  divisors.uniq.inject { |sum,e| sum += e }
end

amicable_pairs = {}
amicable_pairs.instance_eval do
  def has_calculated(num)
     self.has_key?(num) or self.has_value?(num)
  end
end

(1..10000).each do |num|
  unless amicable_pairs.has_calculated(num)
    candidate = sum_of_divisors(num)
    amicable_pairs[num] = candidate if num == sum_of_divisors(candidate) and num != candidate
  end
end
amicable_pairs.sort.each { |k,v| puts "#{k} #{v}" }

Below code is a little bit different version:

Fixnum.class_eval do
  @sum_of_divisors = nil
 
  def sum_of_divisors
    unless @sum_of_divisors
      divisors = [1]
      (2..Math::sqrt(self)).each do |e|
        if self % e == 0
          divisors << e
          divisors << self / e
        end
      end
      @sum_of_divisors = divisors.uniq.inject { |sum,e| sum += e }
    end
    @sum_of_divisors
  end

  def has_amicable_partner?
    self == self.sum_of_divisors.sum_of_divisors and !self.is_perfect?
  end
 
  def amicable_partner
    self.sum_of_divisors
  end
 
  def is_perfect?
    self == self.sum_of_divisors
  end
end
 
amicable_pairs = {}
amicable_pairs.instance_eval do
  def has_calculated(num)
     self.has_key?(num) or self.has_value?(num)
  end
end

(1..10000).each do |num|
  unless amicable_pairs.has_calculated(num)
    amicable_pairs[num] = num.amicable_partner if num.has_amicable_partner? and !num.is_perfect?
  end
end
amicable_pairs.sort.each { |k,v| puts "#{k} #{v}" }



트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://classpath.egloos.com/tb/4607353 [도움말]

핑백

  • Pages tagged "amicable" 2008-09-14 22:22:00 #

    ... Coding Dojo - Amicable_Pair by Ruby</a> saved by 3 others shikamaruntemari4evr bookmarked on 09/14/08 | classpath.egloos.com Sarah McLachlan Separating From Husband saved by 1 others &n ... more

덧글

덧글 입력 영역


구글애드센스