问题 问答题

请编写函数fun(),它的功能是求Fibonacci数列中小于t的最大的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
例如:t=1000时,函数值为987。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <math.h>
#include <stdio.h>
int fun(int t)

main()

int n;
clrscr();
n=1000;
printf("n=%d, f=%d\n",n, fun(n));

答案

参考答案:int fun(int t)
{
int a=1,b=1,c=0,i; /*a代表第n-2项,b代表第n-1项,c代表第n项*/
/*如果求得的数。比指定比较的数小,则计算下一个Fibonacci数,对a,b得新置数*/
do
{
c=a+b;
a=b;
b=c;
}
while(c<t); /*如果求得的数c比指定比较的数大时,退出循环*/
c=a; /*此时数c的前一个Fibonacci数为小于指定比较的数的最大的数*/
return c;
}

解析:根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和(即第n项),而a始终代表第n-2项,b始终代表第n-1项(通过不断地重新赋值来实现)。应注意,退出循环时得到的数c是大于指定比较的数的最小的数,而它的前一个数就是小于指定比较的数的最大的数。

判断题
单项选择题