/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013,郑州大学SIAS国际学院
* 文件名称:
* 作 者: 王 杰
* 完成日期:20 年10 月 29 日
* 对任务及求解方法的描述部分:
* 输入描述:
* 问题描述:
* 程序输出:
* 问题分析:
* 算法设计:
*/
#include<stdio.h>
int main()
{
int m;
int n;
int s;
int flag;
int sum;
scanf("%d",&m);
//scanf("%d",&n);
while(m--){
sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&s);
flag=1;
if(s==1)
flag=0;
else if(s==2)
flag=1;
else
for(int j=2;j*j<=s;j++)
if(s%j==0){
flag=0;
break;
}
if(flag)
sum+=s;
}
printf("%d\n",sum);
}
return 0;
}
运行结果:
总结:1 把输出语句放到了while外面,导致没法输出结果
2 判断素数问题,每次都好用定义求素数,虽然结果正确,但可能会导致时间超时,或者占用内存较大等问题;
所以用j*j<=s就会变得省事很多,像这种格式,还有一好处就是不用调用math头文件和sqrt()函数,如(sqrt((double)s));
3 最重要的一点!!! 就是这个问题让自己找了半天错误: 变量的状态!! 开始时在定义sum时直接初始化,这样导致第一组测试数据是正确的,但关键来了,第一次while循环结束后,输出sum的值, 但是此时sum的值依然为上次测试结果,所以在做第二组测试时,就会在第一组测试结果的基础之上测试第二组数据,这样一直循环累加,导致结果错误,,,所以解决办法是:sum在每一次while循环开始前初始化为0,具体实现是:定义时只定义类型,而初始化放在每次while循环之前,这样第二次循环时,sum重新初始化,把上次的结果覆盖掉,就不会出现错误了。
感悟:在查找错误的时候,一定要考虑全面。不仅要对程序的流程有清晰的认识,还要时刻清楚各个变量的此时此刻对应的状态!!!!!!
4 还有一点,我感觉这是关于经验上的一点,就是那个flag变量的定义,非常的有帮助!!!要学会善于利用这样的技巧。