问答题 编写函数,isValue,它的功能是:求以下数列中满足t(K)=1的最小的k,结果由函数返回。其中数列t(n)的定义为:
t(0)=m(m为给定正整数,m<=300)
t(n+1)=t(n)/2 (当t(n)为偶数时)
或t(n+1)=3*t(n)+1(当t(n)为奇数时)
最后调用函数writeDat()读取50个数据m,分别得出结果且把结果输出到文件out.dar中。
例如:当t=299时,函数值为117。
已知对于m<=300,结果k不超过300
部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
#include<stdio. h>
int jsValue(int m)

main ( )

int m;
m=300;
printf ("m=%d, k-%d/n", m, jsValue (m));
writeDat ( );
writeDat ( )

FILE *in, *out;
int i,m,s;
in= fopen ( "in. dar" , "r" );
out=f open ( "out. dar" , "w" );
for (i=0; i<50; i++)
fscanf (in, "%d", &m);
s=jsValue (m);
printf( "%d/n", s );
fprintf (out, "%d/n" , s );

fclose (in);
fclose (out);

【正确答案】提示:
类型:序列计算。
关键点:分析序列定义,选择合适的方法生成和存储序列或序列中的特定值。
根据序列定义,以及题目的输出要求,可选择保存序列中的所有值,也可以只保留与当前项计算相关的几项,采用递推的方式进行计算。
对于某些特殊序列,还可以求出通项公式,利用公式直接计算。
此题只需要保存当前项,根据当前项计算下一项。
解答:
int isValue(int m)
{
/*初值t(0)=m*/
int fn=m, k=0;
/*t(k) != 1, 求t(k+1)*/
while ( fn>)
{
if (fn%2==1)
/*t(k)为奇数*/
{
fn-3*fn+1;
}
else
/*t (k) 为偶数*/
{
fn=fn/2;
}
k++;
}
/*t (k) ==1, 返回 k*/
return k;
}
【答案解析】