问答题 某级数的前两项A1=1,A2=1,以后各项具有如下关系:
A n =A n-2 +2A n-1
下列程序的功能是:依次求出整数M=100,1000和10000时对应的n值,使其满足:S n <M且S n+1 ≥M,这里S n =A 1 +A 2 +…+A n ,并依次把n值存入数组单元b[0],b[1],b[2]……b[n]中,请编写函数jsValue()来实现此功能,最后调用函数writeDat(),把数组b的值输出到OUT.DAT文件中。
请勿改动主函数main()和输出函数wfiteDat()的内容。
[试题程序]
#include<stdio.h>
int b[3];
void writeDat();
void jsValue()
{
}
void main()
{
jsValue();
printf("M=100,n=%d\nM=1000,n
=%d\nM=10000,n=%d\n",b[0],
b[1],b[2]);
writeDat();
}
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);
}
【正确答案】
【答案解析】void jsValue( )
{
int n=1; /*计数器变量,保存求得的项数*/
int a1=1,a2=1,an; /*用来保存级数的值*/
int sum0,sum; /*用来存储级数的和的变量*/
sum0=a1+a2; /*计算前两项的级数和*/
while(1) /*无条件循环,循环体内有控制是否结束循环的语句*/
{
an=a1+a2*2; /*求下一个级数*/
sum=sum0+an; /*求级数和*/
a1=a2; /*将a2赋给a1*/
a2=an; /*将an赋给a2*/
n++; /**/
if(sum0<100 && sum>=100) /*如果满足Sn<100且sn+1>=100*/
b[0]=n; /*则将n存入数组单元b[0]中*/
if(sum0<1000 && sum>=1000) /*如果满足Sn<1000且sn+1>=1000*/
b[1]=n; /*则将n存入数组单元b[1]中*/
if(sum0<10000 && sum>=10000) /*如果满足Sn<10000且sn+1>=10000*/
{
b[2]=n; /*则将n存入数组单元b[2]中*/
break; /*并强行退出循环*/
}
sum0=sum; /*将sum赋给sum0,为下一次循环的求和作准备*/
}
} [考点] 本题考查数学计算问题。考查的知识点主要包括:C语言循环结构,迭代算法,if判断结构和逻辑表达式。
此题属于数学计算题型。分析题干要求,可以归纳出2个关键点:关键点1如何逐个计算级数的项和前n项和;关键点2如何通过条件"Sn<M 且 Sn+1>=M"找出对应( M=100, M=1000, M=10000)的n的值;
本题解题思路是:首先用一个循环结构作为程序的主体,在该循环体中实现迭代运算,逐个计算该级数的每一项并累加其前n项和,同时判断本题的条件"Sn<M 且 Sn+1>=M"(M=100,1000,10000)是否成立,条件成立时,保存n的值到数组b中,当条件M=10000满足时,保存n并退出循环。本题对应软件中视频串讲第7讲。