首页 > 解决方案 > 下面的代码应该返回最不完美的平方,当添加到它时,总和也是一个完美的平方

问题描述

所以假设我给 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

标签: ruby

解决方案


问题是您的代码永远不会进入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

推荐阅读