加载中...

浙江理工大学入队200题-----9D

问题 D: 零基础学C/C++93——Fibonacci数列

题目描述

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

输入

多组输入数据,先输入一个整数t表示组数,然后每组输入一个整数n(0 <= n <=45)

输出

输出F(n)的值

样例输入 Copy

5
0
3
5
9
20

样例输出 Copy

0
2
5
34
6765

题解

1.我们可以用瞪眼法发现,F[i]是由前两个状态F[i-1]与F[i-2]得来,由此一直递归到F[0]与F[1]。由于递归算法每次递归时都需要调用前面几个F,在时间复杂度最惨为O(2^n),数据大一点时会直接TLE。
2.因此,我们直接用数组来保存每一次F的值,于是求每个F[i]只用调用F[i-1],F[i-2],时间复杂度减小。
3.当然你可以直接斐波那契数列公式。

代码(AC)

仅供参考,无必要还是建议自己写。

点击查看代码
#include <stdio.h>
int main ()
{
	int t,n,i;
	scanf("%d",&t);
	for(i=1;i<=t;i++)
        {  
	    while(scanf("%d",&n)!=EOF)
	    {   
	     	int a[n];
	        a[0]=0;
          	a[1]=1;
		for(i=2;i<=n;i++)
		{
			a[i]=a[i-1]+a[i-2];
		}
		printf("%d\n",a[n]);
    	    }
	}
	return 0;
}
posted @ 2022-10-28 21:34  shany212  阅读(47)  评论(0编辑  收藏  举报