我有一个作业要编写一个方法来确定一个数字是否是斐波那契数列的一部分。
按照公式:
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/