编写函数jsValue,它的功能是:求Hofstadter数列中的第m项H(m)(m<1000),结果由函数返回。其中数列H(n)的定义为:H(1)=H(2)=1H(n)=H(n-H(n-1))+H(n-H(n-2))(n>2)最后调用函数writeDat()读取50个数据m,分别得出结果且把结果输出到文件out.dat中。例如:当t=997时,函数值为605。部分源程序已给出。请勿改动主函数main()和写函数writeDat()的内容。include<stdio. h>int jsValue(int

题目

编写函数jsValue,它的功能是:求Hofstadter数列中的第m项H(m)(m<1000),结果由函数返回。其中数列H(n)的定义为:

H(1)=H(2)=1

H(n)=H(n-H(n-1))+H(n-H(n-2))(n>2)

最后调用函数writeDat()读取50个数据m,分别得出结果且把结果输出到文件out.dat中。

例如:当t=997时,函数值为605。

部分源程序已给出。

请勿改动主函数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" );

ut=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 jsVelue(int m) { if (m0) return -1; /*参数错误正常运行不会出现*/ if(m==1 || m==2) return 1; /*初值H[1]:H[2]=1*/ else return jsValue (m-jsValue (m-1)) +jsValue (m-jsValue (m-2)); /*调用jsValue递归计算H[k]*/ } /*解法二递推*/ int jsValue(int m) { int H[1000] i; H[1]=1;H[2]=1; /*初值H[1]=H[2]=1*/ for (i=3;i=m;i++) { H[i] = H[i-H[i-1)] +H[i-H[i-2]]; /*H(k)(ki)的值都己计算完成直接使用*/ } return H[m]; /*返回所求的值*/ }
int jsVelue(int m) { if (m0) return -1; /*参数错误,正常运行不会出现*/ if(m==1 || m==2) return 1; /*初值H[1]:H[2]=1*/ else return jsValue (m-jsValue (m-1)) +jsValue (m-jsValue (m-2)); /*调用jsValue递归计算H[k]*/ } /*解法二,递推*/ int jsValue(int m) { int H[1000], i; H[1]=1;H[2]=1; /*初值H[1]=H[2]=1*/ for (i=3;i=m;i++) { H[i] = H[i-H[i-1)] +H[i-H[i-2]]; /*H(k)(ki)的值都己计算完成,直接使用*/ } return H[m]; /*返回所求的值*/ } 解析:类型:序列计算。
关键点:分析序列定义,选择合适的方法生成和存储序列或序列中的特定值。
此题有两种解法:
1.按照定义编写递归函数;(计算量大,容易超时,慎用)。
2.保存所有值,从小到大递推求解。
更多“编写函数jsValue,它的功能是:求Hofstadter数列中的第m项H(m)(m<1000),结果由函数返回。其中数列H( ”相关问题
  • 第1题:

    下列程序的功能是:寻找并输出11至999之间的数m,满足m、m2和m3均为回文数。所谓回文数是指各位数字左右对称的整数,例如121、676、94249等。满足上述条件的数,如m=11、m2=121、m3=1331,皆为回文数。请编制函数int svalue(long m)来实现此功能。如果是回文数,函数返回1,反之则返回0。最后,把结果输出到文件out.dat中。部分源程序已给出。请勿改动主函数main()的内容。#include <stdio.h>#include <stdlib.h>#include <string.h>int jsValue(long n){ }main(){ long m; FILE *out; out = fopen("out.dat", "w"); for (m=11; m<1000; m++) if (jsValue(m) && jsValue(m*m) && jsValue(m*m*m)) { printf("m=%4ld,m*m=%6ld,m*m*m=%8ld \n", m, m*m, m*m*m); fprintf(out,"m=%4ld,m*m=%6ld,m*m*m=%8ld \n", m, m*m, m*m*m); } fclose(out);}


    正确答案:参考试题解析
    【解析及答案】
    本题属于按条件查找类型的题目,考核的知识点为判断回文数的算法。
    本题的解题思路为:在11~999之间逐个进行判断,看当前数字是否为回文数。若是回文数,则判断其平方是否为回文数;若其平方也是回文数,则判断其立方是否为回文数;若其立方仍然是回文数,则将原数返回。判断回文数的方法是:先将数字转换为字符型数据,再将其第一个字符与最后一个字符相比较,以此类推,一直执行到中间两个数字比较完成为止;若该字符串左右对称,则该数是回文数。程序的流程是:首先打开文件out.dat,然后通过for循环来调用函数jsValue() ,若mm2m3都是回文数,即函数jsValue() 的返回值都为1时,就将mm2m3写入到文件out.dat中,最后关闭文件out.dat。
    在函数jsValue() 中,首先,函数接收到一个长整型数据作为参数,然后调用函数itoa()。该库函数的格式为itoa(参数1, 参数2, 参数3)。参数1为一个整型数据,参数2为一个字符串的地址,参数3为一个整型常量。该函数的功能是:将第一个参数转换为字符串并存入第二个参数值所对应的内存单元中,然后通过函数strlen() 得到数组xy的实际长度并将其赋予strl。下面的for循环的功能是比较第一个字符与最后一个字符,如果不等,则跳出循环;如果相等,则继续比较下一个字符。在比较的过程中,每次istrl分别向后和向前移动1位,比较一直进行到中间元素被比较后或者有不相等的元素时结束。if语句的功能是确定跳出for循环的原因,若ihalf,则比较完成,返回1,证明该数字为回文数;否则返回0(即不是回文数),函数结束。
    int jsvalue(long n) /*标准答案*/
    {int I,strl,half;
    char xy[20];
    ltoa(n,xy,10);
    strl=strlen(xy);
    half=strl/2;
    for(I=0;I<half;I++)
    if(xy[I]!=xy[--strl]) break;
    if(I>=half) return 1;
    else return 0;
    }

  • 第2题:

    编写函数jsvalue(),其功能是:求Fibonacci数列中大于t的最小的一个数,结果由该函数返回。其中,Fibonacci数列F(n)的定义如下。F(0)=0, F(1)=1F(n)=F(n-1)+F(n-2)最后,调用函数writeDat()读取10个数据t,分别得出结果,并把结果输出到文件out.dat中。例如:当t=1000时,函数值为1597。部分源程序已给出。请勿改动主函数main()和写函数writeDat()的内容。#include <stdio.h>int jsValue(int t){ }void writeDat(){ FILE *in, *out; int i, n, s; in = fopen("in.dat", "r"); out = fopen("out.dat", "w"); for (i=0; i<50; i++) { fscanf(in, "%d,", &n); s = jsValue(n); fprintf(out, "%d\n", s); } fclose(in); fclose(out);}main(){ int n; n = 1000; printf("t=%d,f=%d\n", n, jsValue(n)); writeDat();}


    正确答案:参考试题解析
    【解析及答案】
    本题属于按条件查找类型的题目,考核的知识点为:求解Fibonacci数列的第n项的值;查找满足条件的Fibonacci数列的第n项的值。
    本题的解题思路为:从第1项开始逐个求出Fibonacci数列的每一项的值,并且将其与给定的数据相比较,若找到第1个大于给定数据的值则将其返回。程序的流程为:调用jsvalue(n)函数处理数据,由writeDat()函数将数据写回到文件out.dat中。在jsvalue()函数中,根据题目给出的条件,Fibonacci数列中的每一项的值均为前两项之和。将Fibonacci数列的每一项的都初始化,然后通过while循环的条件进行判断:当Fnt,即第n项的值小于1000时,进入while循环体,计算Fn的值,每计算一个Fn的值就与t比较一次,直到fn>t,即找到大于t的最小的一个数时,循环结束。该while循环的功能就是查找比t大的Fn的值。while循环结束后,利用return语句返回Fn的值,函数结束。
    int jsvalue(int t)
    { int f1=0,f2=1,fn;
    fn=f1+f2;
    while(fn<=t)
    {f1=f2;
    f2=fn;
    fn=f1+f2;}
    return fn;
    }

  • 第3题:

    编写函数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读取l0个数据t,分别得出结果且把结果输出到文件out.dat中。 例如:当t=1000时,函数值为:1597。 注意:部分源程序存在test.c文件中。 请勿改动数据文件in.dat中的任何数据、主函数main和写函数writeDat的内容。


    正确答案:
    【审题关键句】F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n2)。
    【解题思路】
    ①定义表示Fibonacci数列中第F(n-2)项的变量f0,第F(n-1)项的变量n,第F(n)项的变量f2。
    ②当Fibonacci数列中第F(n)项的值f2小于t时,把数列当前第F(n-1)项的值n赋给f0,把数列当前第F(n)项的值f2赋给n,根据Fibonacci数列的递推关系,第n项的值等于第n-1项的值与第n-2项值的和,计算数列当前第n+1项的值f2= f0+n。依次循环,当f2的值大于t时,退出while循环,把f2的值返回。
    【参考答案】

  • 第4题:

    编写函数jsValue(),它的功能是求Pibonacci数列中大于t的最小的一个数,结果由函数返回,其小 Fibonacci数列F(n)的定义为:

    F(0)=0, F(1)=1 ’

    F(n)=F(n-1)+F(n-2)

    最后调用函数writeDat(),把结果输出到文件OUT10.DAT中。

    例如:当t=1000时,函数值为1597。

    注意:部分源程序已给出。

    请勿改动主函数main()和写函数WriteDat()的内容。

    试题程序:

    include

    int jsValue(int t)

    {

    }

    main ( )

    {

    int n;

    n=1000;

    printf("n=%d, f=%d\n", n, jsValue(n));

    writeDat();

    }

    writeDat()

    {

    FILE *in, *out;

    int n,s;

    out = fopen("OUT10.DAT", "w");

    s = jsValue(1000); printf("%d",s);

    fprintf(out, "%d\n", s);

    fclose(out);

    }


    正确答案:int jsValue(int t) { int f1=0f2=1fn; fn=f1+f2; while(fn=t){f1=f2;f2=fn;fn=f1+f2;} /*如果当前的Fibonacci数不大于t则计算下一个Fibonacci数*/ return fn; /*返回Fibonacci数列中大于亡的最小的一个数*/
    int jsValue(int t) { int f1=0,f2=1,fn; fn=f1+f2; while(fn=t){f1=f2;f2=fn;fn=f1+f2;} /*如果当前的Fibonacci数不大于t,则计算下一个Fibonacci数*/ return fn; /*返回Fibonacci数列中大于亡的最小的一个数*/ 解析:解答本题的关键是要充分理解题意,只有理解了题意本身的数学过程,才能把数学过程转化为程序逻辑。根据已知数列,我们不难发现:Fibonacci数列中,从第三项开始,每一项都可以拆分为前两项之和。本题要求找到该数列中“大于t的最小的一个数”。这里可以借助一个while循环来依次取数列中的数,直到出现某一项的值大于t,那么这一项就是“大于t的最小的一个数”。注意:在循环体内部,我们用变量f1始终来表示第n项的前面第二项,用变量f2来始终表示第n项的前面第一项。这就实现了变量的活用与巧用。

  • 第5题:

    编写函数,isValue(),它的功能是求Fibonacci数列中大于t的最小的一个数,结果由函数返回,其中 Fibonacci数列F(n)的定义为:

    F(0)=0,F(1)=1

    F(n)=F(n-1)+F(n-2)

    最后调用函数writeDat(),把结果输出到文件OUTl0.DAT中。

    例如:当t=1000时,函数值为1597。

    注意:部分源程序已给出。

    请勿改动主函数main()和写函数WriteDat()的内容。

    include <stdio.h>

    int jsValue(int t)

    {

    }

    main ( )

    {

    int n;

    n=1000;

    printf("n=%d, f=%d\n", n, jsValue(n));

    writeDat ();

    }

    writeDat ()

    {

    FILE *in, *out;

    int n, s;

    ut = fopen ("OUT10.DAT", "w");

    s = jsValue(1O00); printf("% d",s);

    fprintf(out, "%d\n", s);

    fclose (out);

    }


    正确答案:int jsValue(int t) { int f1=0f2=1fn; fn=f1+f2; while(fn=t) {f1=f2;f2=fn;fn=f1+f2;) /*如果当前的Fibonacci数不大于t 则计算下一个Fibonacci数*/ return fn; /*返回Fibonacci数列中大于t的最小的一个数*/ }
    int jsValue(int t) { int f1=0,f2=1,fn; fn=f1+f2; while(fn=t) {f1=f2;f2=fn;fn=f1+f2;) /*如果当前的Fibonacci数不大于t, 则计算下一个Fibonacci数*/ return fn; /*返回Fibonacci数列中大于t的最小的一个数*/ } 解析:解答本题的关键是要充分理解题意,只有理解了题意本身的数学过程,才能把数学过程转化为程序逻辑。根据已知数列,我们不难发现:Fibonacci数列中,从第三项开始,每一项都可以拆分为前两项之和。本题要求找到该数列中“大于t的最小的一个数”。这里可以借助一个while循环来依次取数列中的数,直到出现某一项的值大于t,那么这一项就是“大于t的最小的一个数”。注意:在循环体内部,我们用变量f1始终来表示第n项的前面第二项,用变量侵来始终表示第n项的前面第一项。这就实现了变量的活用与巧用。