ruby - 下面的代码应该返回最不完美的平方,当添加到它时,总和也是一个完美的平方
问题描述
所以假设我给 13 作为 n,代码应该返回 36,因为 36 是最不完美的平方,当添加到 13 时,它会得到 49,这是一个完美的平方。现在,当我将 4 作为 n 时,它应该返回 -1,因为将 4 添加到所有数字都没有完美的平方,因此它什么也没有返回。该代码无需添加 elsif 即可工作,但这意味着如果我传入 4 它将返回范围。但是一旦我添加了 elsif,它仍然会打印出范围。
def solve n
arr = (1..10).each do |i|
i = (i**2) + n
if (Math.sqrt(i) % 1) == 0
return i - n
elsif false
return -1
end
end
arr
end
p solve(13) #= 36
# # because 36 is the smallest perfect square that can be added to 13 to form a perfect square => 13 + 36 = 49
p solve(3) #= 1 # 3 + 1 = 4, a perfect square
p solve(12) #= 4 # 12 + 4 = 16, a perfect square
p solve(9) #= 16
p solve(4) #= -1
解决方案
问题是您的代码永远不会进入elsif
分支,这就是为什么您在(1..10)
迭代后获得范围的原因,因为这是值arr
保持不变,并且在检查 if 之后没有返回值(Math.sqrt(i) % 1) == 0
。
如果在迭代期间没有显式返回,您可以只返回 -1:
def solve n
(1..10).each do |i|
i = (i**2) + n
return i - n if (Math.sqrt(i) % 1).zero?
end
-1
end
solve(3) # 1
solve(12) # 4
solve(9) # 16
solve(4) # -1