应用题 6.  下列程序的功能是选出100~1000间的所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数(如293)。计算并输出满足上述条件的素数的个数cnt,以及这些素数值的和sum。请编写函数countValue()实现程序功能,最后调用函数writeDAT(),把结果cnt和sum输出到文件OUT.DAT中。
    请勿改动主函数main()和写函数writeDAT()的内容。
    [试题程序]
    #include<stdio.h>
    int cnt, sum;
    void writeDAT();
    void countValue()
    {
    }
    void main()
    {
    cnt=sum=0;
    countValue();
    printf("素数的个数=%d\n", cnt);
    printf("满足条件素数的和=%d", sum);
    writeDAT();
    }
    void writeDAT()
    {
    FILE*fp;
    fp=fopen("OUT.DAT", "w");
    fprintf(fp, "%d\n%d\n", cnt, sum);
    fclose(fp);
    }
【正确答案】void countValue()
   { 
   int i, j;                    /*定义循环控制变量*/
   int half;
   int a3, a2, a1;               /*定义变量存储3位数每位的数字*/
   for(i=101; i<1000; i++)       /*在该范围内寻找符合条件的数*/
   {
   a3=i/100;               /*求百位数字*/
   a2=i%100/10;            /*求十位数字*/
   a1=i%10;                /*求个位数字*/
   if(a3==(a2+a1)%10)      /*如果个位数字与十位数字之和被10除所得余数恰是百位数字*/
   {
   half=i/2;
   for(j=2; j<=half; j++)       /*进一步判断该数是否为素数*/
   if(i%j==0) break;        /*如果不是素数,则跳出循环,接着判断下一个数*/
   if(j>half)                 /*如果是素数*/
   {
   cnt++;         /*计算这些素数的个数cnt*/
   sum+=i;        /*计算这些素数值的和sum*/
   }
   }
   }
   }
【答案解析】[考点] 本题考查对一定范围内整数的筛选。考查的知识点主要包括:多位整数的分解算法,素数的判断算法,if判断语句和逻辑表达式。
   此题属于数学类问题。分析题干要求,归纳出本题的2个关键点:关键点1判断该数是否为素数;关键点2判断是否满足条件:个位数字和十位数字之和被10除所得余数等于百位数字。
   本题思路为:通过循环语句,依次求出所有3位数的各位数数字,并判断是否满足关键点2(个位数字和十位数字之和被10除所得余数等于百位数字),如果满足则判断该数是否为素数,如果是则个数加1,并将该数加到和值中。判断的方法为:依次取从2到该数1/2的数去除这个数,如果有一个可被整除,则不是素数,如果循环后的数大于该数的一半就可以判定该数是一个素数。