Я работаю над следующим упражнением.Поиск дружественных чисел
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) }
Я не вижу /
как неопределенный метод на линии; эта часть работает нормально, когда я запускаю ее самостоятельно. Это единственная строка, с которой я не могу работать независимо, и она просто дает неопределенную/ошибку.
Ваше описание противоречива. Можете ли вы запустить линию 5 самостоятельно или нет? – sawa
запустите свой диапазон для дружбы от '(2..10000)' он сработает для вас и вернет '40284';) –
Да, я могу запустить строку 5. Извините, что это не была строка с проблемами, которые я сделал правильно. Спасибо, изменив его на 2 работы. Должен ли я удалить этот вопрос? – usernm