0

我正在尝试解决斐波那契问题,并且遇到了四舍五入的问题。

如果i = 8670007398507948658051921那么fib1 = 19386725908489880000000000.0.

我的代码如下 - 感谢您的帮助。

def is_fibonacci?(i)

  fib1 = Math.sqrt(5*(i**2)+4)
  fib2 = Math.sqrt(5*(i**2)-4)

  fib1 == fib1.round || fib2 == fib2.round ? true : false

end
4

1 回答 1

1

像这样的 sqrt 对这么大的值不起作用,因为 sqrt 返回一个 Float 并且它的精度在这里不够用。我建议您实现自己的 sqrt 函数。有几种算法建议如何做到这一点,但我个人认为使用二进制搜索来计算函数的反向是最简单的:

def sqrt a
  begv = 1
  endv = a
  while endv > begv + 1
     mid = (endv + begv)/2
     if mid ** 2 <= a
        begv = mid
     else
        endv = mid
     end
  end
  return begv
end

或者,您可以尝试对 sqrt 使用 BigDecimal(简单地提高幂0.5),但我更喜欢上述方法,因为它不涉及任何双重计算。

于 2013-03-20T16:30:54.480 回答