2016-02-22 2 views
0

Я работаю над следующим упражнением.Поиск дружественных чисел

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.

Я выполнил выполнение каждого сегмента моего решения самостоятельно. Вот то, что я до сих пор:

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) } 

Я не вижу / как неопределенный метод на линии; эта часть работает нормально, когда я запускаю ее самостоятельно. Это единственная строка, с которой я не могу работать независимо, и она просто дает неопределенную/ошибку.

+0

Ваше описание противоречива. Можете ли вы запустить линию 5 самостоятельно или нет? – sawa

+0

запустите свой диапазон для дружбы от '(2..10000)' он сработает для вас и вернет '40284';) –

+0

Да, я могу запустить строку 5. Извините, что это не была строка с проблемами, которые я сделал правильно. Спасибо, изменив его на 2 работы. Должен ли я удалить этот вопрос? – usernm

ответ

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 
+0

Спасибо. Оказывается, мой код получает неправильный ответ, даже когда я начинаю с 2. Любая идея, что я ошибся? – usernm

+0

Да. Вы не смогли рассмотреть все требования проблемы, и у дружественного массива есть неправильное количество элементов, которые вы затем суммируете, чтобы создать неправильный ответ. Проверьте эти элементы, и вы обнаружите проблему. –

Смежные вопросы