ruby - 如何确定一个数字是否属于斐波那契数列?

标签 ruby

我有一个作业要编写一个方法来确定一个数字是否是斐波那契数列的一部分。

按照公式:

a positive integer z is a Fibonacci number if and only if one of 5z^2 + 4 or 5z^2 − 4 is a perfect square

我定义了以下适用于小数和大斐波那契数的方法,但是,无论出于何种原因,我的分配规范在处理大的非斐波那契数时会抛出错误,特别是在运行 is_fibonacci?(927372692193078999171) 时。显然该方法返回 true 而不是 false。其他一切似乎都是正确的,所以我有点想知道为什么这行不通。有什么建议么?

def is_fibonacci?(i)
  bigNumber1 = Math.sqrt((5*(i**2)+4))
  bigNumber2 = Math.sqrt((5*(i**2)-4))
  if bigNumber1 == bigNumber1.round || bigNumber2 == bigNumber2.round
    return true
  else 
    return false
  end
end

最佳答案

如其他地方所述,问题在于 float 的精度。 BigDecimal提供任意精度算法:

require 'bigdecimal'

def is_fibonacci?(i)
  i = BigDecimal.new(i)
  bigNumber1 = (5*(i**2)+4).sqrt(0)
  bigNumber2 = (5*(i**2)-4).sqrt(0)
  return (bigNumber1 == bigNumber1.round || bigNumber2 == bigNumber2.round)
end

is_fibonacci? 927372692193078999171 # => false
is_fibonacci? 927372692193078999176 # => true

关于ruby - 如何确定一个数字是否属于斐波那契数列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549214/

相关文章:

arrays - Ruby:根据值替换数组中的元素

ruby - 将 IE 11 x64 与页面对象一起使用时出现 "Watir::Exception::NoMatchingWindowFoundException: browser window was closed"错误

ruby-on-rails - RubyMine 对 SASS 的支持

mysql - 在 Ruby on Rails 应用程序中使用 MySQL View 来提高性能

类名中的 Ruby 插值

Ruby 字符串连接和三元不玩得好吗?

ruby-on-rails - 在断言方法的参数中使用感叹号

ruby - 如果 `self` 始终是 Ruby 中的隐含接收者,为什么 `self.puts` 不起作用?

ruby-on-rails - 如何使用嵌套 if 语句从 if 语句设置变量

ruby-on-rails - 没有要加载的文件 - Rails 3.2 中的 bundle 程序/设置与 Passenger