寻找友好数字

时间:2016-02-22 04:44:41

标签: ruby

我正在进行以下练习。

  

设d(n)定义为n的适当除数之和(小于n的数均匀分为n)。   如果d(a)= b且d(b)= a,其中a≠b,则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 is_amicable?(num)
    proper_factors = (1..(num/2)).select{ |n| num % n == 0}
    partner = proper_factors.inject(:+)

    if (1..(partner/2)).select{ |n| partner % n == 0}.inject(:+) == num
        return true
    else
        return false
    end
end

amicable = (1...10000).select{ |num| is_amicable?(num) }
sum = amicable.inject(:+)

p sum

我的is_amicable?方法独立运行,但当我一起运行时,我收到错误:

amicable_numbers.rb:5:in `is_amicable?': undefined method `/' for nil:NilClass (NoMethodError)

从我能收集的内容来看,问题出现在这一行:

amicable = (1...10000).select{ |num| is_amicable?(num) }

我不认为/是未定义的方法;当我独立运行时,该部分工作正常。这是我唯一能够独立运行的行,它只是给出了未定义/错误。

1 个答案:

答案 0 :(得分:0)

当您将1传递给is_amicable?时,您会收到此错误。追踪

num = 1
proper_factors = (1..(num/2)).select{ |n| num % n == 0} => []
partner = proper_factors.inject(:+) => nil

然后你做

partner/2 => NoMethodError: undefined method `/' for nil:NilClass