【问题标题】:To find if a number is fibonacci or not判断一个数是否为斐波那契数
【发布时间】:2022-01-04 14:17:00
【问题描述】:

我是一名学生,刚接触 python。我正在尝试编写一个程序来判断用户输入的数字是否为斐波那契。

num=int(input("Enter the number you want to check\n"))
temp=1
k=0
a=0
summ=0
while summ<=num:
    summ=temp+k
    temp=summ
    k=temp
    if summ==num:
        a=a+1
        print("Yes. {} is a fibonnaci number".format(num))
        break
if a==0:
    print("No. {} is NOT a fibonacci number".format(num))
#The program is working for only numbers upto 2.

【问题讨论】:

  • 欢迎来到stackoverflow。请阅读stackoverflow.com/help/how-to-ask
  • 你的问题是什么?
  • k=temp 紧跟在 temp=summ 之后,所以 ktemp 是同一个数字,而不是您想要的最后两个斐波那契数。

标签: python fibonacci


【解决方案1】:

您不需要那么多变量。一次赋值即可生成斐波那契整数序列

a, b = b, a + b

# Short for
#     temp = a
#     a = b
#     b = temp + b 

重复的应用程序将a 依次设置为模式中的数字。 ab 的初始值的选择决定了你得到的确切序列。使用a = 0b = 1 时会生成斐波那契数。

a = 0
b = 1

a, b = 1, 0 + 1  # 0, 1
a, b = 1, 1 + 1  # 1, 2
a, b = 2, 1 + 2  # 2, 3
a, b = 3, 2 + 3  # 3, 5
# etc

(再举一个例子,如果您以a = 2b = 1 开头,则会生成卢卡斯数。)

所有你需要做的就是在每一步返回True if n == a,迭代直到n &gt; a。如果n 不是循环生成的a 值之一,您将返回False

n = int(input(...))
a = 0
b = 1
while a <= n:
    if n == a:
        return True
    a, b = b, a + b
return False

【讨论】:

    【解决方案2】:

    我建议这样:

    fib_terms = [0, 1]  # first two fibonacci terms
    
    user_input= int(input('Enter the number you want to check\n'))
    
    # Add new fibonacci terms until the user_input is reached
    while fib_terms[-1] <= user_input:
        fib_terms.append(fib_terms[-1] + fib_terms[-2])
    
    if user_input in fib_terms:
        print(f'Yes. {user_input} is a fibonacci number.')
    else:
        print(f'No. {user_input} is NOT a fibonacci number.')
    

    【讨论】:

      【解决方案3】:

      检查一下:

      def fibonacci_list(limit):
          u_n_1 = 1
          u_n_2 = 1
          u_n = 1
          out_list = [u_n]
          while u_n <= limit:
              out_list.append(u_n)
              u_n = u_n_1 + u_n_2
              u_n_2 = u_n_1
              u_n_1 = u_n
          return out_list
      
      
      def is_fibonacci_number(n):
          if n in fibonacci_list(n):
              return True
          return False
      
      
      def main():
          n = int(input('Enter a number:'))
          if is_fibonacci_number(n):
              print(str(n) + ' is a fibonacci number ')
          else:
              print(str(n) + ' is not a fibonacci number ')
      
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

      • 看起来很长但很容易理解
      • 列出清单并将其与数字进行比较是一种解决方案并且有效,但它太长且效率低下,请查看@chepner,他的答案似乎非常好且实用。
      【解决方案4】:
      bool checkfibonacci(int n)
          {
              int a = 0;
              int b = 1;
              if (n == a || n == b) return true;
              int c = a + b;
              while(c <= n)
              {
                  if(c == n) return true;
                  a = b;
                  b = c;
                  c = a + b;
              }
              return false;
          }
      

      这样的事情就可以了。

      【讨论】:

        【解决方案5】:

        欢迎来到 python 社区。​​p>

        在您的代码中,temp 表示前一个数字,k 表示 temp 的前一个数字。问题是您在将下一个值分配给k 之前更改了temp。要解决这个问题,您只需要锯掉第 8 行和第 9 行。在新顺序中,您首先将 temp 的值分配给 k,然后将 summ 分配给 temp。就是这样!

        我建议你通过这样的列表来做: fib[i] = fib[i-1] + fib[i-2] 它将提高代码的清晰度。

        【讨论】:

          猜你喜欢
          • 2011-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-10
          • 2015-06-05
          • 2014-05-23
          • 2014-05-03
          相关资源
          最近更新 更多