有一个函数d(n)定义为n的适当除数之和(小于n的数均分为n)。例如,220的适当除数是1,2,4,5,10,11,20,22,44,55和110;因此d(220)= 284. 284的适当除数是1,2,4,71和142;所以d(284)= 220.检查范围内的任何模数是否为零
我想在Ruby中实现这个d(n)函数。我的第一本能是使用一个for循环来遍历所有n值并检查模数。下面的代码工作:
我可以得到它像这样一个for循环工作:
def d(n)
proper_divisors = []
for i in 1...n
if (n % i == 0)
proper_divisors.push(i)
end
end
return proper_divisors.inject(:+)
end
但是,从前面的回答中我了解到,it's very rare to use a for loop in Ruby
。这就是为什么我尝试这样做:
def d(n)
(1..n).inject(0) { |total| total+ n if (n % (1..n) == 0) }
end
因此,从值从1 to n
我开始total
等于0,并添加n
到total
如果n
可同样由数量从1分至n。自Range can't be coerced into Fixnum (TypeError)
以来,if (n % (1..n) == 0)
部分不起作用。
我该如何做到这一点,我将一个数字的模数对一个范围取反,如果它等于零,则返回true?
只是使用n/2 .... –
你可以优化循环到'(1..n/2)',看看'n/2'之后没有什么可以作为n的正确除数'? heh @AlokAnand,同样的想法^ _^ –
是啊,谢谢你们:) –