我的目标是写一个方法,trickysum(n)
执行以下操作:如何在不更改原始数组的情况下复制和删除数组?
该方法取数字1到n的范围。然后该方法找到该范围内符合棘手条件的数字对:该对数字的乘积必须等于范围内所有数字的总和,不包括该对。该方法然后返回符合此限定条件的所有数字对。这里是期待:
trickysum(26)
#=>[(15, 21), (21, 15)]
这里是代码我到目前为止:
def trickysum(n)
result = []
arr = (1..n).to_a
0.upto(arr.length - 1) do |x|
0.upto(arr.length - 1) do |y|
prod = arr[x] * arr[y]
#I create a new array to delete from to not affect the original
#array. Would also love an easier way to do this :)
new_arr = arr
new_arr.delete(new_arr[x])
new_arr.delete(new_arr[y])
sum = new_arr.inject(:+)
if sum == prod
result << "(#{arr[x]},#{arr[y]})"
end
end
end
result
end
我一遍又一遍地看着此代码,想不通为什么我得到的以下错误:
nil can't be coerced into Fixnum
(repl):7:in `*'
(repl):7:in `block (2 levels) in trickysum'
(repl):6:in `upto'
(repl):6:in `block in trickysum'
(repl):5:in `upto'
(repl):5:in `trickysum'
(repl):20:in `<main>'
我在哪里出错了?
这里有一个更好的算法。设S是1到n的和。那么你想'x * y = S-x-y'。这可以重新排列为'(x + 1)*(y + 1)= S + 1'。所以如果'S'是复合的,只需找到适当的除数对'S'。 –
当问一个问题时,我们需要一个更好的标题,一个“如何”做些事情。 –
@RoryDaulton'(31,10)'如何解决?大卫在范围内清楚地表明了“1到** n **”(在这种情况下,“n == 26”)。 –