问答题
某级数的前两项A
1
=1,A
2
=1,以后各项具有如下关系:
A
n
=A
n-2
+2A
n-1
程序test.c的功能是:要求依次对于整数M,求出级数前n的和S
n
=A
1
+A
2
+…+A
n
小于M的项数n,并依次把n值存入数组单元b[0],b[1]和b[2]中,请考生编制jsValue()函数来实现此功能,最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
请勿改动主函数main()和输出数据函数writeDAT()的内容。
#include <stdio.h>
int b[3]; //定义全局整型一维数组b[3]
void writeDAT(); //输出函数writeDAT()的说明语句
void jsValue()
{
}
main ()
{
jsValue(); //调用函数jsValue () ,实现题目要求的功能
printf("M=100, n=%d\nM=1000, n=%d\nM= 10000, n=%d\n", b[0], b[1], b[2]);
writeDAT ();
}
/*函数writeDat()把数据b[]中的值输出到out.dat文件中*/
void writeDAT()
{
FILE *fp;
fp=fopen("out.dat", "w");
fprintf(fp, "%d\n%d\n%d\n", b[0], b[1], b[2]);
fclose(fp);
}
【正确答案】
【答案解析】int a1=1, a2=1, s=2, n=1, m=10, i, t;
for(i=0;i<3;i++) //循环变量i从0开始,每次递增1,直到其值小于3
{
m*=10; //m的值扩大10倍后,其值等于100
while(s<m) //当s的值小于m时,执行while循环语句
{
/*变量t表示第n项,a1表示第n-2项,a2表示第n-1项*/
t=a1+2*a2; //根据级数第n项的递推关系,第n项等于第n-2项与2倍的第n-1项的和
s=s+t; //前n项的和等于前n-1项的和加上第n项的值
n=n+1; //求级数第n项的下一项,即第n+1项
a1=a2; //把当前的第n-1项赋给第n-2项
a2=t; //把当前的第n项赋给第n-1项
}
printf("m=%d,n=%d\n",m,n); //当退出while循环,把m值和求的n值在屏幕上显示出来
b[i]=n; //把求的n值存入数组元素b[i]中
}
[解析] Sn=A
1
+A
2
+…+A
n
,A
n
=A
n-2
+2A
n-1
,S
n
<M且S
n+1
≥M,M=100、1000和10000。
①首先定义变量并赋值,包括表示级数的整型变量a1、a2,赋初值1,表示级数前n项的和s,其初值为2,表示级数的第n项t,循环变量i,级数n项赋初值1,。
②采用for循环,循环变量i从0开始依次递增到2。在循环体中对m的值扩大10倍,当级数前n项的和s小于m时,根据级数的第n项等于第n-2项与2倍的第n-1项的和,把表达式a1+2*a2的值赋给变量t。然后把级数前n-1项的和s加上第n项的值t赋给变量s,求得级数前n项的和赋给变量s。把n的值加1,在下次循环中计算级数第n+1项的值,把变量当前级数第n-1项的值a2赋给第n-2项a1,把当前的第n项t的值赋给第n-1项a2。当级数前n项的和s大于或等于m时,退出while循环。在屏幕上输出变量m和n的值,并把求的n值赋给数组元素b[i],进入下一次for循环。