问答题 某级数的前两项A1=1,A2=1,以后各项具有如下关系:
An=An-2+2An-1
下列程序的功能是:依次对于整数M=100、1000和10000求出对应的n值,使其满足:Sn<M且Sn+1≥M,这里Sn=A1+A2+…+An,并依次把n值存入数组单元b[0]、b[1]和b[2]中。请编写jsValue()函数来实现此功能,最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
#include <stdio.h>
int b[3];
void jsValue()
{
}
main()
{
jsValue();
printf("M=100,n=%d/nM=1000,n=%d/nM=10000,n=%d/n",b[0],b[1],b[2]);
writeDat();
}
writeDat()
{
FILE *fp;
fp=fopen("out.dat","w");
printf("%d/n%d/n%d/n",b[0],b[1],b[2]);
fprintf(fp,"%d/n%d/n%d/n",b[0],b[1],b[2]);
fclose(fp);
}
【正确答案】void jsValue() { int A1=1,A2=1,n=1,An; int sum0,sum; sum0=A1+A2; while(1) { An=A1+A2*2; /*计算下一项的值*/ sum=sum0+An; /*将刚计算的项加上前面累加的和得到新的累加和*/ A1=A2; /*A1、A2分别往后移动一项*/ A2=An; n++; /*计数值n增1*/ /*若旧的累加和sum0小于100,且新的累加和sum大于100*/ if (sum0<100 && sum>=100) b[0]=n; /*将计数值n存入数组b*/ /*若旧的累加和sum0小于1000,且新的累加和sum大于1000*/ if (sum0<1000 && sum>=1000) b[1]=n; /*将计数值n存入数组b*/ /*若旧的累加和sum0小于10000,且新的累加和sum大于10000*/ if (sum0<10000 && sum>=10000) { b[2]=n; /*将计数值n存入数组b*/ break; /*三个n均已找出,跳出循环*/ } sum0=sum; /*将新的累加和赋给sum0准备开始下一轮循环*/ } }
【答案解析】