我希望有人可以帮助我。给定一个数字n(不必是斐波纳契数),我必须找到这个数字是否等于两个斐波纳契数之间的差值,如果不是,我必须将最接近的数字返回到n,让我们称它为m(这是不必是斐波纳契数),这是两个斐波纳契数之间的差异。
我不是在寻找确切的算法实现,而是在某些指针上查看。
答案 0 :(得分:4)
假设n > 0
没有太多普遍性。自1 = 1 - 0 = fib(1) - fib(0)
起,结果m
也是正数。设0 ≤ i < j
并考虑fib(j) - fib(i)
。我们有界限
fib(j-2) = fib(j) - fib(j-1) ≤ fib(j) - fib(i) ≤ fib(j).
因此,对于每个n
,只需考虑fib(j-2) ≤ n ≤ fib(j)
的可能性。事实上,我们可以将其收紧到fib(j-2) < n ≤ fib(j)
,因为我们也可以将fib(j) - fib(j-1)
写为fib(j-2) - fib(0)
。计算对数/使用二进制搜索以查找j
的两个有效设置。对于j
的每个设置,请以相同的方式找到i
的最佳值。
答案 1 :(得分:2)
n的范围是多少? 如果n最多为2 ^ 64,则可以容纳93(根据http://oeis.org/A000045/b000045.txt)斐波纳契数。所以我们有93 * 93对数字。
并不是很多,所以你可以做一个大小为93x93的二维数组(略小于10000个元素),这样数组中的每个元素都是第i个和第j个斐波纳契数之间的差异,i和j是数组的索引。
然后你可以把值放到一维数组中(如果需要的话,你也可以把两个斐波那契数字放在一起)。然后只需按值对数组进行排序。通过对此阵列执行二进制搜索,如果存在这样的数字n,则可以非常快地找到,或者如果不存在,则可以找到与n最接近的数字。
您可以跳过制作二维数组并将值直接放到一维数组中。我这样说,所以更容易理解和呈现这个概念。
它可能不是最好的方法,如果n可能很大,但在某些情况下,当你需要很多测试时,它应该是合理的方法。