程序test.c的功能是:计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔减、加之和,即第1个素数.第2个素数+第3个素数.第4个素数+第5个素数…的值sum。请编写函数count Value实现程序的要求,最后main函数调用函数writeOAT把结果cnt和Sum,输出到文件out.dat中。

题目

程序test.c的功能是:计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔减、加之和,即第1个素数.第2个素数+第3个素数.第4个素数+第5个素数…的值sum。请编写函数count Value实现程序的要求,最后main函数调用函数writeOAT把结果cnt和Sum,输出到文件out.dat中。


相似考题
更多“程序test.c的功能是:计算500~800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔减、加之和,即第1个素数.第2个素数+第3个素数.第4个素数+第5个素数…的值sum。请编写函数count Value实现程序的要求,最后main函数调用函数writeOAT把结果cnt和Sum,输出到文件out.dat中。”相关问题
  • 第1题:

    下列程序的功能是:选出100~1000间的所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数(如293)。计算并输出上述这些素数的个数cnt,以及这些素数值的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT17.DAT中。

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

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

    试题程序:

    include <stdio.h>

    int cnt, sum;

    void countValue()

    {

    }

    main()

    {

    cnt=sum=0;

    countValue();

    print f ("素数的个数=%d\n", cnt);

    printf("满足条件素数值的和=%d", sum);

    writeDAT();

    }

    writeDAT()

    {

    FILE *fp;

    fp=fopen("OUT17.DAT", "w");

    fprintf(fp, "%d\n%d\n", cnt, sum);

    fclose(fp);

    }


    正确答案:void countValue() { int i j halfhun ten data; for (i=101; i1000;i++) { hun=i/100; /*求百位数字*/ ten=i%100/10; /*求十位数字*/ data=i%10; /*求各位数字*/ if (hun== (ten+data)%10) /*如果个位数字与十位数字之和被10除所得余数恰是百位数 字 则进一步判断该数是否为素数*/ { half=i/2; for (j=2; jhalf; j++) if (i%j==0) break; if (j >=half) {cnt++; sum+=i; } /*计算这些数的个数cnt 以及这些素数值的和sum*/ } } }
    void countValue() { int i, j ,half,hun, ten, data; for (i=101; i1000;i++) { hun=i/100; /*求百位数字*/ ten=i%100/10; /*求十位数字*/ data=i%10; /*求各位数字*/ if (hun== (ten+data)%10) /*如果个位数字与十位数字之和被10除所得余数恰是百位数 字, 则进一步判断该数是否为素数*/ { half=i/2; for (j=2; jhalf; j++) if (i%j==0) break; if (j >=half) {cnt++; sum+=i; } /*计算这些数的个数cnt, 以及这些素数值的和sum*/ } } } 解析:本题的解题思路是利用一个for循环依次取得100到1000之间的数,接着求得当前所取得的数的各个位上的数字值,语句“hun=i/100;ten=i%100/10:data=i%10:”可以分别取得某数的百位、十位及个位上的数字值,然后判断该数个位数字与十位数字之和被10除所得的余数是否恰好等于百位上的数字。如果这个条件成立,接着去判断原数是否是素数,这里,考虑到效率问题,可以依次用从2到该原数本身一半的数去除原数,如果原数能被除尽,则证明该数肯定不是素数,不需要做下面的工作,接着去取下一个数,继续判断。只有同时满足上述两个条件的数才是本题所需的数,这时把该数累加到变量sum (满足条件素数值的和)中,同时也给计数器变量cnt(素数的个数)加1。

  • 第2题:

    下列程序的功能是:计算出启然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件OUT51.DAT中。其中的S,I,X,N,I,N,E各代表一个十进制数。

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

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

    试题程序:

    include

    int cnt,sum;

    void CountValue()

    {

    }

    Void main()

    {

    Cnt=Sum=0;

    COUNtValUe();

    printf("满足条件的个数=%\n",cnt):

    printf("满足条件的所有的SIX与NINE的和=%d\n",sum);

    }

    WriteDAT();

    {

    FILE *fp;

    fp=fopen("OUT51.DAT", "w");

    fprintf(fp,"%d\n%d\n",cnt,sum);

    fclose(fp);

    }


    正确答案:void countValue() { int i=100; while(1) { if(3*i%2==0 && 3*i/2>1000 && 3*i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE*NINE*/ { /*即一个3位数乘3再除2余数为0 且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足此条件的所有SIX与NINE的和*/ i++; } else i++; /*如果不满足条什则取下一个数*/ if(i>999 || 3*i/2>9999) break; /*当SIX不为3位数时或所得的数不为四位数时退出循环*/ } }
    void countValue() { int i=100; while(1) { if(3*i%2==0 && 3*i/2>1000 && 3*i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE*NINE*/ { /*即一个3位数乘3再除2余数为0, 且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足此条件的所有SIX与NINE的和*/ i++; } else i++; /*如果不满足条什,则取下一个数*/ if(i>999 || 3*i/2>9999) break; /*当SIX不为3位数时或所得的数不为四位数时,退出循环*/ } } 解析:本题考查的知识点如下:
    (1)循环与判断的嵌套使用。
    (2)多条件的布尔运算。
    (3)“%”与“/”运算符的使用。
    根据题意,求的是满足3位数乘以3等于4位数乘以2的数的个数。我们可以使用循环结构对所有的3位数进行判断,若某个3位数乘以3整除2所得的数是4位整数,则这个3位数足满足条件的数。当判断的数不再是3位数或者进行处理后所得的数大于9999,则要退出循环。在这里,还要注意判断结构中,各条件之问是用“与”运算还是用“或”运算。

  • 第3题:

    下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数I(1+10也是在100以内)的个数cnt,以及这些I之和sum。请编制函数countValue()实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件out64.dat中(数值1不是素数)。

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

    请勿改动主函数main()和输出数据函数writeDAT()的内容。

    试题程序:

    include<stdio.h>

    int cnt, sum;

    int isPrime(int number)

    {

    int i,tag=1;

    if (number==1)

    return 0;

    for(i=2;tag && i<=number/2;i++)

    if(number%i==0) tag=0;

    return tag;

    }

    void countValue ( )

    {

    }

    void main( )

    {

    cnt=sum=0;

    countValue ( );

    printf ( "满足条件的整数的个数=%d\n", cnt);

    printf ( "满足条件的整数的和值=%d\n", sum);

    writeDAT ( );

    }

    writeDAT ( )

    {

    FILE *fp;

    fp=fopen("out64.dat","w");

    fprintf(fp,"%d\n%d\n",cnt,sum);

    fclose(fp);

    }


    正确答案:void countValue() { int icount=0xx[30]; int jkm; cnt=0; sum=0; for(i=2;i90;i++) /*找数的范围为100以内*/ if(isPrime(i)) /*如果该数为素数则将它存入数组xx中并统计个数*/ { xx[count]=i; count++; } for(i=0;icount;i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if(isPrime(xx[i]+4)&&isPrime(xx[i]+10)) { cnt++; /*统计满足条件的数的个数*/ sum+=xx[i]; /*将满足条件的数组xx中的数求和*/ } }
    void countValue() { int i,count=0,xx[30]; int j,k,m; cnt=0; sum=0; for(i=2;i90;i++) /*找数的范围为100以内*/ if(isPrime(i)) /*如果该数为素数,则将它存入数组xx中,并统计个数*/ { xx[count]=i; count++; } for(i=0;icount;i++) /*如果数组xx中的素数加4和加10得到的数仍为素数*/ if(isPrime(xx[i]+4)&&isPrime(xx[i]+10)) { cnt++; /*统计满足条件的数的个数*/ sum+=xx[i]; /*将满足条件的数组xx中的数求和*/ } } 解析:本题考查的知识点如下:
    (1)循环结构与判断结构的嵌套使用。
    (2)判断结构中多个条件的布尔运算。
    题中要求判断在100以内,i,i+4,i+10都是素数的个数。因为i+10也必须在100以内,1不是素数,我们可以从2开始判断到89即可(90是偶数,明显不是素数)。可以先找出2到89之间素数的个数,再判断这些素数加4和加10后是否还是素数。加4是素数与加10是素数必须同时满足,所以两个条件间用“与”运算。

  • 第4题:

    请补充main函数,该函数的功能是:把1~100间的所有素数保存在数组aa中,然后输出这些素数并计算它们的和。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在 main函数的横线上填入所编写的若干表达式或语句。

    试题程序:

    include<stdio.h>

    main()

    {

    int n, i, j, k, flag, sum;

    int aa [50];

    sum=O;

    k=O;

    clrscr ();

    for (i=2; i<100; i++)

    {

    【 】;

    for (j=2; j<i&&flag; j++)

    if (i%j==O)

    {

    【 】;

    }

    if (flag)

    {

    sum+=i;

    【 】;

    }

    }

    printf("\n*** prime number ***\n");

    for (i=0; i<k; i++)

    {

    if (i%10==0)

    printf ("\n");

    printf ("%4d", aa [i]);

    }

    printf ("\nsum=%d", sum);

    }


    正确答案:flag=1 flag=0 aa[k+++]=i
    flag=1 flag=0 aa[k+++]=i 解析:第一空:由后面的if句可以看出,当nag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将fflag清零。第二空:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。如果当前数不是素数,则将flag清零。第三空:如果当前数是素数,则将它保存在数组bb中。

  • 第5题:

    程序test.c的功能是:计算出自然数SIX和NINE满足条件SIX+SIX+SIX=NINE+NINE的个数cnt,以及满足此条件的所有SIX与NINE的和SUM。请编写函数countValue实现程序的要求,最后main函数调用函数writeDAT把结果cnt和 sum,输出到文件0ut.dat中。 其中的S,I,X,N,E各代表一个十进制数字,允许代表的数字相同,但s和N不能为0。例如:944+944+944=1416+1416注意:部分源程序存放在test.c文件中。 请勿改动主函数main和输出数据函数writeDAT的内容。


    正确答案:
    【审题关键句】计算满足条件的sIX+sIX+sIx-NINE+NINE的SIX和NINE的个数以及满足此条件所有的SIX与NINE的和,S,I,X,N,E各代表一个十进制数字。
    【解题思路】
    ①定义整型变量S,i,X,n,e,six,nine。
    ②在第一层for循环中,因为S的值不能为0,所以循环变量s从1开始,依次递增直到其值等于10,退出循环。在第二层for循环中,循环变量i从0开始,依次递增直到其值等于10,退出循环。在第三层for循环中,循环变量X从0开始,依次递增直到其值等于10,退出循环。在第四层for循环中,因为n的值不能为0,所以循环变量n从1开始,依次递增直到其值等于10,退出循环。在第五层for循环中,循环变量e从0开始,依次递增直到其值等于10。
    ③设置完所有for循环条件后,在循环体中,由变量S的值乘以l00,变量i的值乘以10,以及变量X组成一个三位数赋给变量six,由变量n的值乘以1000,变量i的值乘以100,变量n的值乘以10,以及变量e组成一个四位数赋给变量nine,再用if条件语句判断,如果三倍的six等于两倍的nine,则计数变量cnt加1,把six与nine的和累加到变量sum,同时在屏幕上,输出six与nine的值。
    【参考答案】


  • 第6题:

    程序test.c的功能是:将大于整数m且紧靠m的k个素数存入数组XX。请考生编写函数num(intm,intk,intxx[])实现程序的要求,最后调用函数readwriteDAT0把结果输出到0ut.dat文件中。 例如,若输入17,5,则应输出:19,23,29,31,37。


    正确答案:
    【审题关键句】将大于整数m且紧靠m的k个素数存入数组。
    【解题思路】
    ①首先定义一个计数变量cnt并赋初值为0。
    ②利用while循环统计大于整数m且紧靠m的k个素数,当计数变量cnt的值与变量k的值相等的时候,则退出while循环。每执行一次循环时,变量m的值加1,然后调用函数isP判断当前的m值是否为素数,如果是素数,则将m的值赋给数组xx[cnt],同时计算变量cnt的值加1,即当数组xx[0]中保存了一个素数之后,在T一次素数判断成立时将保存到xx[1]的位置上,依次类推。
    【参考答案】

  • 第7题:

    程序test.c的功能是:选出1000至5000范围内(包括l 000、5000)符合下面条件的四位自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的整10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数countValue实现程序的要求。最后main函数调用函数 writeDAT把结果cnt和sum输出到out.dat文件中。 注意:部分源程序存放在test.c文件中。 请勿改动主函数main和输出数据函数writeDAT的内容。


    正确答案:
    【审题关键句】千位+百位等于十位+个位,且千位+百位等于个位-千位的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和。
    【解题思路】
    ①首先定义一个循环变量i,以及分别用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、SW(十位)和 gw(个位)。
    ②通过for循环依次对数组中的每个四位数进行分解,循环初值为l 000,终值为5000,每循环一次,循环变量i的值加1。每分解一个四位数,根据题目要求,判断其“千位+百位=十位+个位”的条件是否满足,同时判断“(千位+百位)=(个位-千位)*10”的条件是否满足,两个条件之间用运算符进行连接。当同时满足以上两个判断条件时,计数变量cnt的值加l,同时将该四位数累加到求和变量sum中,最终得到满足条件的四位自然数个数cnt及它们的和sum。
    本题中cnt和sum变量在源程序中已经定义,在该子程序中就不需要再重新定义了。
    【参考答案】

  • 第8题:

    给定程序MODll.C中函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

    请改正函数fun中指定部位的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!


    正确答案:(1)y=1; (2)d=a-i;
    (1)y=1; (2)d=a-i; 解析:本题中函数的功能是为一个偶数查找两个素数,这两个素数之和等于该偶数。其中,函数fun用形参a放偶数,指针b和c放两个素数。把一个偶数分解成1和(x-1)两个数是否是素数,再分解为3和(x-3)这两个数,判断是否是素数,依此类推,直到找出这两个素数为止。本题中把偶数分解为i和d两个素数。判断i是否是素数,如果i不是素数,则i+2再循环;如果i是素数,则d=x-i,然后判断d是否是素数。

  • 第9题:

    已知数据文件in.dat中存有300个四位数,并已调用读函数readDat把这些数存入数组a中,请编制一函数isValue,其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。最后main函数调用写函数writeDat把数组b中的数输出到out.dat文件中。 例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。 9812是非素数,则该数不满足条件忽略。 注意:部分源程序存在test.C文件中。 程序中已定义数组:a[300],b[300],已定义变量:cnt请勿改动数据文件in.dat中的任何数据、主函数main、读函数readDat和写函数writeDat的内容。


    正确答案:
    【审题关键句】求素数的个数,存入数组,按从小到大的顺序排序。
    【解题思路】
    ①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量tmp。
    ②通过for循环依次读取数组中的300个数,其中,循环变量i从0开始每次加1,直到i<300停止循环;在每次循环中判断a[i]是否是素数,如果是素数,则把a[i]的值赋给数组b[cnt],同时数组下标变量cnt值加1。
    ③在退出循环后,用两个for循环对数组b[]中元素进行两两比较,实现数组元素从小到大的排序,比较过程中通过整型变量tmp实现两个数的交换。
    【参考答案】

  • 第10题:

    已知数据文件IN14.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中。请编制一个函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到OUT14.DAT文件。

    例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。

    9812是非素数,则该数不满足条件,忽略。

    注意:部分源程序已给出。程序中已定义数组:a[300]、b[300];已定义变量:cnt。请勿改动主函数main()、读函数 readDat()和写函数writeDat()的内容。

    [试题程序]

    include<stdio.h>

    int a[300],b[300],cnt=0;

    int isP(int m)

    {

    int i;

    for(i=2;i<m;i++)

    if(m%i==0)return 0;

    return 1;

    }

    void jsValue()

    {

    }

    main()

    {

    int i;

    readDat();

    jsValue();

    writeDat();

    for(i=0;i<cnt;i++)printf("b[%d]=%d\n",i,b[i]);

    }

    readDat()

    {

    FILE *fp;

    int i;

    fp=fopen("IN14.DAT","r");

    for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);

    fclose(fp);

    }

    writeDat()

    {

    FILE *fp;

    int i;

    fp=fopen("OUT14.DAT","w");

    fprintf(fp,"%d\n",cnt);

    for(i=0;i<cnt;i++)fprintf(fp,"%d\n",b[i]);

    fclose(fp);

    }


    正确答案:void jsValue() { int jivalue; for(i=0;i300;i++) if(isP(a[i])){b[cnt]=a[i];cnt++;} for(i=0;icnt-1;i++) /*将数组b中的四位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;j++) if(b[i]>b[i]){value=b[i];b[i]=b[j];b[j]=value;} } [解析] 此题型考查的知识点包括以下几方面: (1) 运算符“/”(相除)和“%”(取余)的灵活运用; (2) 循环结构的使用; (3) 数据的排序(在这里主要是使用选择排序法); (4) 选择结构的使用。 此函数的功能是:求出所有这些四位数中是素数的数值并依次存入数组b中然后对数组b中的四位数按从小到大的顺序进行排序。程序中判断素数的函数isP()已给出。
    void jsValue() { int j,i,value; for(i=0;i300;i++) if(isP(a[i])){b[cnt]=a[i];cnt++;} for(i=0;icnt-1;i++) /*将数组b中的四位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;j++) if(b[i]>b[i]){value=b[i];b[i]=b[j];b[j]=value;} } [解析] 此题型考查的知识点包括以下几方面: (1) 运算符“/”(相除)和“%”(取余)的灵活运用; (2) 循环结构的使用; (3) 数据的排序(在这里主要是使用选择排序法); (4) 选择结构的使用。 此函数的功能是:求出所有这些四位数中是素数的数值,并依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序。程序中判断素数的函数isP()已给出。

  • 第11题:

    试题1

    下列程序的功能是:找出所有100以内(含100)满足i,i+4,i+10都是素数的整数i(i+10也在100以内)的个数cnt以及这些i之和sum。请编写函数countvalue()实现程序要求,最后调用函数writeDat()把结果cnt和sum输出到文件out.dat中。

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

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

    试题程序:

    #include <stdio.h>

    int cnt, sum;

    int isPrime(int number)

    {

    int i, tag = 1;

    for (i=2; tag && i<=number/2; i++)

    if (number%i == 0)

    tag = 0;

    return tag;

    }

    void countValue()

    {

    }

    void writeDat()

    {

    FILE *fp;

    fp = fopen("out.dat", "w");

    fprintf(fp, "%d\n%d\n", cnt, sum);

    fclose(fp);

    }

    void main()

    {

    cnt = sum = 0;

    countValue();

    printf("满足条件的整数的个数=%d\n", cnt);

    printf("满足条件的整数的和值=%d\n", sum);

    writeDat();


    正确答案:

    试题1答案:
    void countvalue()
    {
    int i;
    for(i=2;i<=90;i++)
    if(isPrime(i) && isPrime(i+4) && isPrime(i+10))
    {
    cnt++;
    sum+=i;
    }
    } }
    试题1分析:
    该程序属于按条件查找数字的题目,考核的知识点为:(1)素数的判定;(2)统计个数并求和。
    本题的解题思路是:题目要求的筛选范围是“所有100以内(含100)满足i、i+4、i+10都是素数的整数i(i+10也在100以内)”,由于最小的素数是2,且i+10要在100以内(含100),所以筛选的范围是2~90。
    题目要求的筛选条件是“满足i、i+4、i+10都是素数的整数i”。在答题之前,应先通读题目已给出的源程序,在我们要实现的函数countvalue()之前给出一个在题目中从未提及的函数isPrime()。仔细分析这个函数的代码不难发现,它实现了从2~number/2内寻找能整除number的数,如果找到就使变量tag为0,此时循环条件将不成了,最终返回0,如果找不到,变量tag为1,返回1.这段代码实现的是判断一个数是够是素数。所以在函数中对筛选条件可以简化为if(isPrime(i) && isPrime(i+4) && isPrime(i+10))。
    程序的流程是:调用countvalue()函数对数据进行处理,最后由writeDAT()函数将结果写入文件out.dat中。
    在countvalue()函数中,For循环的功能是判断i、i+4、i+10是否都为素数,若在素数则将i累加到sum中,同时个数cnt加1,函数结束。

     

  • 第12题:

    单选题
    ACM算法的素数和计算中,sum变量用于累加素数之和,那么它的初值应赋值为()
    A

    0

    B

    1

    C

    100

    D

    不赋初值


    正确答案: D
    解析: 暂无解析

  • 第13题:

    已知数据文件IN.DAT中存有300个四位数,并已调用读函数READDAT() 把这些数存入数组a中。请编制函数Svalue(),其功能是:求出这些四位数中素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后将数组b中的四位数按从小到大的顺序排序,最后调用写函数writeDat(),把结果输出到文件OUT.DAT中。例如:5591是素数,则满足条件,存入数组b中,且个数cnt=cnt+1;9812是非素数,则不满足条件,忽略。部分源程序已给出。程序中已定义数组a[300]、b[300],已定义变量cnt。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。#include <stdio.h>int a[300], b[300], cnt = 0;int isP(int m){ int i; for (i=2; i<m; i++) if (m%i == 0) return 0; return 1;}void jsValue(){ }void ReadDat(){ FILE *fp; int i; fp = fopen("in.dat", "r"); for (i=0; i<300; i++) fscanf(fp, "%d,", &a[i]); fclose(fp);}void writeDat(){ FILE *fp; int i; fp = fopen("out.dat", "w"); fprintf(fp, "%d\n", cnt); for (i=0; i<cnt; i++) fprintf(fp, "%d\n", b[i]); fclose(fp);}main(){ int i; ReadDat(); jsValue(); writeDat(); printf("cnt=%d\n", cnt); for (i=0; i<cnt; i++) printf("b[%d]=%d\n", i, b[i]);}


    正确答案:参考试题解析
    【解析及答案】本题的程序属于按条件查找特定类型的数字的程序,考核的知识点为判断素数和排序算法。
    本题的解题思路是:逐个判断数组a中的元素是否为素数,如果是素数,则将其存入数组b中,最后对数组b进行升序排列。计算方法是:每次选定一个位置的元素,然后将该元素与该元素后面的所有元素进行比较,如果该元素比其后面的元素大,则两者交换,较比完成后,此位置的元素比其后面所有的元素都小;比较一直进行到所有元素均被访问后结束。在该程序中已经给出一个函数 isP()。通过分析可知,该函数的功能是判断参数m是否为素数,若是素数,则返回1;若不是,则返回0。在解答本题时,若题目中提供了此类函数,就可以直接调用,为编程提供便利。
    程序的流程是:首先调用函数ReadDat() 读入数据,然后调用函数jsValue() 对数据进行处理,最后由函数writeDat() 将结果写回到文件out.dat中。在函数jsValue() 中,首先通过一个for循环来判断a[i] 是否为素数,若是素数,则把a[i] 存入数组b中,且记录个数的变量cnt的值将增加1,然后通过两重for循环将数组b中的元素进行升序排列,函数结束。
    void jsvalue() /*标准答案*/
    {int j,I,value;
    for(I=0;I<300;I++)
    if(isP(a[I])) {b[cnt]=a[I];cnt++;}
    for(I=0;I<cnt-1;I++)
    for(j=I+1;j<cnt;j++)
    if(b[I]>b[j])
    {value=b[I]; b[I]=b[j]; b[j]=value;}
    }

  • 第14题:

    已知数据文件IN58.DAT中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函njsValue(),其功能是:求出这些4位数是素数的个数cnt,再把所有满足此条件的4位数依次存入数组 b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到

    OUT58.DAT文件中。

    例如:5591是素数,则该数满足条件,存入数组b中,且个数cnt=cnt+1。

    9812是非素数,则该数不满足条件,忽略。

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

    程序中已定义数组:a[300],b[300],已定义变量:cnt。

    请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

    试题程序:

    include<stdio.h>

    int a[300],b[300],cnt=0;

    int isP(int m)

    {

    int i;

    for(i=2;i<m;i++)

    if(m%i==0) return 0;

    return 1;

    jsValue()

    {

    }

    main ( )

    {

    int i;

    readDat ();

    jsValue();

    writeDat ();

    printf ("cnt=~/od\n",cnt);

    for (i=0; i<cnt; i++)

    printf("b[%d]=%d\n",i,b[i]);

    }

    readDat ( )

    {

    FILE *fp;

    int i;

    fp=fopen ("IN58. DAT", "r");

    for (i=0; i<300; i++)

    fscanf (fp, "%d, '", &a [i] );

    fctose(fp);

    }

    writeDat ()

    {

    FILE *fp;

    int i;

    fp=fopen ( "OUT58. DAT", "w" );

    fprintf ( fp, "%d\n", cnt);

    for (i=0; i<cnt; i++)

    fprintf(fp, "%d\n",b[i]);

    fclose (fp);

    }


    正确答案:jsValue ( ) { int i j value; for (i=0; i300; i++) if (isP (a [ii ) ) /*如果该数为素数则将该数存入数组b中*/ { b[cnt]=a[i]; } for (i=0; icnt-1; i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for (j=i+l; jcnt; j++) if (b [ii >b[j ] ) { value=b [i]; b[i]=b[j]; b [j] =value; } }
    jsValue ( ) { int i, j, value; for (i=0; i300; i++) if (isP (a [ii ) ) /*如果该数为素数,则将该数存入数组b中*/ { b[cnt]=a[i]; } for (i=0; icnt-1; i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for (j=i+l; jcnt; j++) if (b [ii >b[j ] ) { value=b [i]; b[i]=b[j]; b [j] =value; } } 解析:本题考查的知识点如下:
    (1)循环的嵌套。
    (2)数据的排序。
    在本题中,已给出了判断素数的函数void isP(int m),只需将数代入进行判断即可。将素数存入数组b,再对数组b中的数进行排序。排序采用“选择排序法”——第一次从第一个数据开始和所有后面的数据进行比较,与比它大(小)的数据交换位置,将数据中最大(小)的数交换到最前面。第二次从第二个数据开始与后面的数据进行比较,将本次比较中最大(小)的数据交换至第二个位置,直至最后一个数据。以此类推,则可完成题目的要求。

  • 第15题:

    已知数据文件IN58.DAT中存有300个4位数,并己调用读函数readDat()把这些数存入数组a中,请编制一函数isValue(),其功能是:求出这些4位数是素数的个数cnt,再把所有满足此条件的4位数依次存入数组b中,然后对数组b的4位数按从小到大的顺序进行排序,最后调用函数writeDat()把数组b中的数输出到OUT58.DAT文件中。

    例如:5591是素数,则该数满足条件,存入数组b中,且个数cnt=cnt+1。

    9812是非素数,则该数不满足条件,忽略。

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

    程序中已定义数组:a[300],b[300],已定义变量:cnt。

    请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。

    试题程序:

    include<stdio.h>

    int a[300],b[300],cnt=0;

    int isP(int m)

    {

    int i;

    for(i=2;i<m;i++)

    if(m%i==0) return 0;

    return 1;

    }

    jsValue()

    {

    }

    main()

    {

    int i;

    readDat();

    jsValue();

    writeDat();

    printf("cnt=%d\n",cnt);

    for(i=0;i<cnt;i++)

    printf("b[%d]=%d\n",i,b[i]);

    }

    readDat ( )

    {

    FILE *fp;

    int i;

    fp= fopen ( "IN58. DAT", "r" );

    for (i=0; i<300; i++)

    fscanf(fp,"%d,",&a[i])

    fclose (fp);

    }

    writeDat ( )

    {

    FILE *fp;

    int i;

    fp=fopen ( "OUT58. DAT", "w" );

    fprintf(fp,"%d\n",cnt);

    for (i=0; i<cnt; i++)

    fprintf (fp, "%d\n", b[i]

    fclose(fp);

    }


    正确答案:jsValue() { int ijvalue; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数则将该数存入数组b中*/ { b[cnt]=a[i]; cnt++; /*并统计满足条件的数的个数*/ } for(i=0;icnt-1;i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;i++) if(b[i]>b[j]) { value=b[i]; b[i]=b[j]; b[j]=value; } }
    jsValue() { int i,j,value; for(i=0;i300;i++) if(isP(a[i])) /*如果该数为素数,则将该数存入数组b中*/ { b[cnt]=a[i]; cnt++; /*并统计满足条件的数的个数*/ } for(i=0;icnt-1;i++) /*对数组b的4位数按从小到大的顺序进行排序*/ for(j=i+1;jcnt;i++) if(b[i]>b[j]) { value=b[i]; b[i]=b[j]; b[j]=value; } } 解析:本题考查的知识点如下:
    (1)循环的嵌套。
    (2)数据的排序。
    在本题中,已给出了判断素数的函数voidisP(intm),只需将数代入进行判断即可。将素数存入数组b,再对数组b中的数进行排序。排序采用“选择排序法”——第一次从第一个数据开始和所有后面的数据进行比较,与比它大(小)的数据交换位置,将数据中最大(小)的数交换到最前面。第二次从第二个数据开始与后面的数据进行比较,将本次比较中最大(小)的数据交换至第二个位置,直至最后一个数据。以此类推,则可完成题目的要求。

  • 第16题:

    编写函数int fun(int lim, int aa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求出的素数的个数。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include<conio.h>

    include<stdio.h>

    define MAX 100

    int fun(int lim, int se[MAX])

    {

    }

    main()

    {

    int limit,i,sum;

    int aa[MAX];

    clrscr();

    printf("输入一个整数");

    scanf("%d",&limit);

    sum=fun(limit,aa);

    for(i=0;i<sum;i++)

    {

    if(i%10==0&&i!=0) /*每行输出10个数*/

    printf("\n");

    printf("%5d ",aa[i]);

    }

    }


    正确答案:int fun(int lim int aa[MAX]) { int ijk=0; for(i=2;i=lim;i++) /*求出小于或等于lim的全部素数*/ { for(j=2;ji;j++) if(i%j==0) break; if(j>=i) aa[k++]=i;; /*将求出的素数放入数组aa中*/ } return k; /*返回所求出的素数的个数*/ }
    int fun(int lim, int aa[MAX]) { int i,j,k=0; for(i=2;i=lim;i++) /*求出小于或等于lim的全部素数*/ { for(j=2;ji;j++) if(i%j==0) break; if(j>=i) aa[k++]=i;; /*将求出的素数放入数组aa中*/ } return k; /*返回所求出的素数的个数*/ } 解析:在做这道题时,我们只需掌握素数的基本算法就可以了,一般表示素数的方法如下:
    for (j=2;ji;j++)
    if(i%j==0) break;
    if(j>=i)

  • 第17题:

    编写函数fun,其功能是:将所有大于1小于整数m的非素数存人XX所指数组中,非素数的个数通过k返回。

    例如,若输入17,则应输出:4 6 8 9 10 12 14 15 16。注意:部分源程序在文件PROGl.C中。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。


    正确答案:
    【考点分析】本题考查:如何判断非素数;循环判断结构;数组的引用。【解题思路】题目要求将l—m之问的非素数存人数组中,应使用循环判断结构。循环语句用来遍历1一m之间的每个数,判断语句用来判断该数是否为素数,若不是素数,则将其存人数组中。这道题目是考查—个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。【解题宝典】判定一个数是否为素数,即该数除了能被l和它本身外,不能被任何数整除。代码实现为:for(j=2;j<i;j++)if(i%j==0)/*如余数为0,证明i不是素数·/此语句需要熟记,很多判断素数的题目也可通过此法解决。

  • 第18题:

    已知数据文件in.dat中存有300个四位数,并已调用读函数readDat把这些数存入数组a中,请编制一函数jsValue,其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。最后maini函数调用写函数writeDat把数组b中的数输出到0ut.dat文件中。 例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。 9812是非素数,则该数不满足条件忽略。 注意:部分源程序存在test.C文件中。 程序中已定义数组:a[300],b[300],已定义变量:cnt


    正确答案:
    【审题关键句】求素数的个数,存入数组,按从小到大的顺序排序。
    【解题思路】
    ①首先定义两个循环变量循环i、j和一个用于数据交换的整型变量tmp。
    ②通过for循环依次读取数组中的300个数,其中,循环变量i从0开始每次加1,直到i<300停止循环;在每次循环中判断a[i]是否是素数,如果是素数,则把a[i]的值赋给数组b[cnt],同时数组下标变量cnt值加1。
    ③在退出循环后,用两个for循环对数组b[]中元素进行两两比较,实现数组元素从小到大的排序,比较过程中通过整型变量tmp实现两个数的交换。
    【参考答案】

  • 第19题:

    程序test.c的功能是:选出大于100小于1000的所有个位数字与十位数字之和被10除所得余数恰是百位数字的所有素数(如293)。计算并输出上述这些素数的个数cnt以及这些素数值的和sum。请考生编写函数countValue实现程序要求,最后调用函数writeDAT把结果cnt和sum输出到文件out.dat中。


    正确答案:
    【审题关键句】选出100以上、1000以内所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数,计算并输出上述这些素数的个数以及这些素数值的和。
    【解题思路】
    ①首先定义一个循环变量循环i以及用来存放3位数分解之后各位数的变量bw(百位)、SW(十位)和gw(个位)。②通过for循环对100到999的每个数字进行逐个的扫描,循环变量i从100开始,每执行一次循环,i的值加1。③在每次执行for循环时,分解当前变量i值的百位上的数字、十位上的数字和个位上的数字,然后利用表达式(gw+SW)
    %10==bw来判断个位数字与十位数字之和被l0除所得余数与百位数字是否相等,同时调用函数isP判断变量i的值是否是素数,如果以上两个条件同时满足(两个表达式通过运算符进行连接),则计数变量cnt值加1、并把其值加到变量sum上,直到循环结束,即可求出从100到999中所有满足条件的素数的个数和它们的和。
    【参考答案】


  • 第20题:

    程序test.c的功能是:计算100以内满足以下条件的所有整数i的个数cnt以及这些i之和sum。条件:i,i+4,i+10都是素数,同时i+10小于100。请考生编写函数countvalue实现程序要求,最后调用函数wfiteDAT把结果cnt和sum输出到文件out.dat中。(数值l不是素数)


    正确答案:
    【审题关键句】100以内(含l00)满足i、i+4、i+10都是素数的整数的个数以及这些i之和。
    【解题思路】
    ①首先定义循环变量i,然后将i的值赋初值为3,每循环一次则将i的值加1,直到i<90。
    ②在for循环中,每执行一次循环则调用函数isPrime(该函数具体的算法已经在源程序中给出,直接用即可),对i、 i+4、i+10是否同时是素数进行判断,如果这三个数同时为素数,则计数变量cnt值加1,同将时将变量i的值累加到sum上。
    【参考答案】

  • 第21题:

    请补充函数proc(),该函数的功能是判断一个数是否为素数。该数是素数时,函数返回字符串:“yes!”,否则函数返回字符串:“no!”,并在主函数中输出。

    注意:部分源程序给出如下。

    请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。

    试题程序:


    正确答案:

    【l】char*proc(intn)【2】2【3】n%i==0
    【解析】由整个程序可知,【1】应为函数proc()的函数头。根据主函数中的调用可知形参的个数和类型,因此,【1】处填“char”proc(intn)”。素数为只能被1和它本身整除的整数。要判断一个整数是否为素数,要看它是否能被除1和小于它本身之外的数整除,因此,【2】处填“2”;【3】处填“n%i==0”。

  • 第22题:

    下列程序的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数 cnt,以及满足此条件的所有SIX与NINE的和sum。请编写函数countValue()实现程序要求,最后调用函数 writeDAT()把结果cnt和sam输出到文件OUT51.DAT中。其中的S,L X,N,I,N,E各代表一个十进制数。

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

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

    试题程序:

    include<stdio. h>

    int cnt, sum;

    void countValue()

    {

    }

    void main ()

    {

    cnt=sum=O;

    countValue ();

    printf ("满足条件的个数=%d\n", cnt);

    printf ("满足条件所有的SIX与NINE的和=%d\n", sum);

    writeDAT ();

    }

    writeDAT ( )

    {

    FILE *fp;

    fp=fopen("OUT51.DAT", "w");

    fprintf (fp, "%d\n%d\n", cnt, sum);

    fclose (fp);

    }


    正确答案:void countValue() { int i=100; while (1) { if(3*i%2==0 && 3'i/2>=1000 && 3'i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE+NINE*/ { /*即一个3位数乘3再除2余数为0且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足上条件的所有SIX与NINE的和*/ i++; } else i++; /*如果果不满足条件则取下一个数*/ if(i>999 II 3'i/2>9999) break; /*当SIXP不为3位数或所得的数不为四位数时退出循环*/ } } }
    void countValue() { int i=100; while (1) { if(3*i%2==0 && 3'i/2>=1000 && 3'i/2=9999) /*如果满足条件SIX+SIX+SIX=NINE+NINE*/ { /*即一个3位数乘3再除2余数为0,且所得的数为4位数*/ cnt++; /*统计满足条件的数的个数*/ sum+=i+3*i/2; /*求满足上条件的所有SIX与NINE的和*/ i++; } else i++; /*如果果不满足条件,则取下一个数*/ if(i>999 II 3'i/2>9999) break; /*当SIXP不为3位数或所得的数不为四位数时,退出循环*/ } } } 解析:本题二查的知识点如下:
    (1)循环与判断的嵌套使用。
    (2)多条件的布尔运算。
    (3)“%”与“/”运算符的使用。
    根据题意,求的是满足3位数乘以3等于4位数乘以2的数的个数。我们可以使用循环结构对所有的3位数进行判断,若某个3位数乘以3整除2所得的数是4位整数,则这个3位数是满足条件的数。当判断的数不再是3位数或者进行处理后所得的数大于9999,则要退出循环。在这里,还要注意判断结构中,各条件之间是用“与”运算还是用“或”运算。

  • 第23题:

    ACM算法的素数和计算中,sum变量用于累加素数之和,那么它的初值应赋值为()

    • A、0
    • B、1
    • C、100
    • D、不赋初值

    正确答案:A