📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 |问题 56(1)

📅  最后修改于: 2023-12-03 15:07:34.773000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 |问题 56

这是ISRO CS 2017比赛的第56题。该比赛由国际空间研究组织(ISRO)主办,旨在推广空间科技和计算机科学。

该题目要求你实现一个函数,该函数用于判断一个给定的整数x是否是斐波那契数列中的一个数。函数签名如下:

def is_fib(num: int) -> bool:
    pass
输入

一个整数x (0<=x<=10^9)

输出

如果x是斐波那契数列中的一个数,则返回True,否则返回False。斐波那契数列是指从0, 1开始,后面的每个数都是前面两个数之和。

示例
assert is_fib(0) == True
assert is_fib(1) == True
assert is_fib(2) == True
assert is_fib(3) == True
assert is_fib(4) == False
assert is_fib(5) == True
assert is_fib(6) == False
assert is_fib(7) == False
assert is_fib(8) == True
assert is_fib(9) == False
assert is_fib(10) == False
assert is_fib(11) == True
assert is_fib(12) == False
assert is_fib(13) == True
assert is_fib(14) == False
assert is_fib(15) == False
assert is_fib(16) == True
assert is_fib(17) == False
assert is_fib(18) == False
assert is_fib(19) == True
assert is_fib(20) == False
思路

要判断一个数x是否在斐波那契数列中,其实只需要判断它是不是能表示成斐波那契数列的某两个相邻数之和即可。

我们可以从前往后依次计算斐波那契数列,并且把每个数都保存到一个列表中,然后判断x是否在列表中即可。

另一种更简洁的方法,是使用斐波那契数列的性质。设当前计算到第n个斐波那契数,我们知道它等于前两个斐波那契数之和,即 $fib(n) = fib(n-1) + fib(n-2)$。于是可以计算出前几个斐波那契数,然后不断使用这个式子计算后面的斐波那契数即可。

实际上,不必每次都保存所有斐波那契数,只需要记录前两个数,然后不断地更新即可。

代码
def is_fib(num: int) -> bool:
    if num == 0:
        return True
    a, b = 0, 1
    while b < num:
        a, b = b, a + b
    return b == num