问答题
编写函数jsValue(int t),它的功能是:求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2) (n≥2)
最后调用函数writeDat()读取10个数据t,分别得出结果且把结果输出到文件out.dat中。
例如:当t=1000时,函数值为:1597。
请勿改动数据文件in.dat中的任何数据、主函数main()和写函数writeDat()的内容。
#include <stdio.h>
void writeDat(); //函数writeDat()的说明语句
int jsValue(int t)
{
}
main ()
{
int n;
n=1000; //把1000赋给n
/*在屏幕上显示1000和Fibonacci数列中大于1000的最小的一个数*/
printf ("n=%d, f=%d\n", n, jsValue (n));
writeDat ();
}
/*函数writeDat()读取10个数据t,分别得出结果且把结果输出到文件out.dat中*/
void writeDat()
{
FILE *in, *out; //定义文件指针in和out
int i, n, s;
in=fopen("in.dat", "r"); //以只读的方式打开文件in.dat,并且使文件指针in指向文件in.dat
out=fopen("out.dat", "w"); //以只写的方式打开文件out.dat,并且使文件指针out向文件out.dat
/*每次从文件in.dat中读取一个数赋n,并计算出Fibonacci数列中大于n的最小的一个数s,并且把s的值写入out.dat文件*/
for(i=0; i<i0; i++) //循环变量i从0开始,每次递增1,直到其值等于10
{
fscanf(in, "%d", &n); //从in.dat文件中读取一个数赋给n
s=jsValue (n); //计算Fibonacci数列中大于n的最小一个数并赋给s
fprintf(out, "%d\n", s); //把s的值写入文件out.dat
}
fclose(in); //关闭文件in.dat
fclose (out); //关闭文件out.dat
}
【正确答案】
【答案解析】int f0=0,f1=1,f2=1; //定义整型变量f0,f1,f2,并分别赋初值为0,1,1
/*f0表示数列中的第F(n-2)项,f1表示数列中的第F(n-1)项,f2表示数列中的第F(n)项*/
while(f2<t) //当数列中的第F(n)项的值小于t时,执行while循环
{
f0=f1; //把数列当前第F(n-1)项的值赋给f0
f1=f2; //把数列当前第F(n)项的值赋给f1
f2=f0+f1; //数列当前第F(n-1)项的值加上第F(n)项的值得到数列第F(n+1)项的值
}
return f2; //退出while循环时,得到Fibonacci数列中大于t的最小的一个数f2,返回
[解析] F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。
①定义表示Fibonacci数列中第F(n-2)项的变量f0,第F(n-1)项的变量f1,第F(n)项的变量f2。
②当Fibonacci数列中第F(n)项的值f2小于t时,把数列当前第F(n-1)项的值n赋给f0,把数列当前第F(n)项的值f2赋给f1,根据Fibonacci数列的递推关系,第n项的值等于第n-1项的值与第n-2项值的和,计算数列当前第n+1项的值f2=f0+f1。依次循环,当f2的值大于t时,退出while循环,把f2的值返回。