本题要求实现求Fabonacci数列项的函数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
函数接口定义:
int fib( int n );
函数fib
应返回第n
项Fibonacci数。题目保证输入输出在长整型范围内。
裁判测试程序样例:
#include <stdio.h>
int fib( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
7
输出样例:
13
Fibonacci数列为:
1 1 2 3 5 8 13 21 34...... |
特点是,该数列前两项为1(需要特殊处理),以后的每一项为前两项之和,可以理解为f(n)=f(n-1)+f(n-2)可以直接求,或者用数组的方式来计算。
代码如下:
第一种方法:直接算
int fib( int n )
{
int x=1,y=1,t,i;
if(n==1||n==2)//前两项特殊处理
return 1;
for(i=3;i<=n;i++)
{
t=x+y;//t为第n项,计算完t后,让x等于原来的y,y等于t,再次循环时就可以保持t=前两项之和
x=y;
y=t;
}
return t;
}
第二种方法:用数组计算
int fib( int n )
{
int a[100000],i=0;
a[0]=a[1]=1;//对a[0],a[1]赋初始值1;
if(n==1||n==2)//特殊情况处理
return 1;
else
{
for(i=2;i<n;i++)
{
a[i]=a[i-1]+a[i-2];//a[i]为第i+1项Fabonacci数
}
return a[i-1];//返回第n项也就是循环后a[i]的结果,即a[i-1](因为循环条件是i<n)
}
}