浙江理工大学入队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;
}
本文来自博客园,作者:shany212,转载请注明原文链接:https://www.cnblogs.com/codeshany/p/zstu_200_9d.html