下列程序的功能是:选出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();
printf("素数的个数=%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,half,hun,ten,data,j,flag=0;
for(i=101;i<1000;i++)
{ half=i/2;
for(j=2;j<=half;j++)
{ if(i%j==0) break;
else if(j>half) flag=1;
}
hun=i/100;ten=i%100/10;data=i%10;
if((ten+data)%10==hun&&flag==1)
{cnt++; sum+=i;}
}
}
谢谢了
參考答案:简单点说
最大的问题在于你的flag在循环里没有置零
试想当第一个素数被找到将flag置1后,
flag就恒为1那么后面所有的数都会被认为是素数
这显然不合题义
应该是这样的
void countValue()
{
int i,half,hun,ten,data,j,flag=0;
for(i=101;i<1000;i+=2)
{
half=i/2+1;//最好是half=sqrt(i)+1;这样效率更高
flag=0;
for(j=2;j<=half;j++)
{
if(i%j==0){flag=1; break;}
}
if(flag) continue;
hun=i/100;
ten=(i%100)/10;//加个括号这是良好的编程习惯
data=i%10;
if((ten+data)%10==hun)
{cnt++; sum+=i;}
}
}