现在的位置: 首页 > 综合 > 正文

南阳理工OJ_素数求和问题

2014年05月20日 ⁄ 综合 ⁄ 共 962字 ⁄ 字号 评论关闭
/*  
* 程序的版权和版本声明部分:  
* 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变量的定义,非常的有帮助!!!要学会善于利用这样的技巧。

抱歉!评论已关闭.