关于一道算法题的抱怨

最近没事干,于是在刷天勤论坛创办的一个OJ,题库都是些简单的题,还有各大高校历年的考研上机题,很适合我这种菜鸟。毕竟,没有参加过ACM比赛,也没有受过系统的算法训练。所以也就当成对自己的一种锻炼吧。

刷了一段时间后,逐渐发现一些问题了,有一次,看了题目的条件后,总是感觉不对,因为按照题目的要求算法,根本得不出来指定的输出结果,所以直接改了题目条件试了一下,果然给的条件错误,还好,那只是一个很明显的错误。然而,昨天又遇到一个题目,这回真的无从下手了。

题目描述
给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少?
输入
输入一行,只包括6个小于100的正整数,其中第一个正整数就是a。
输出
可能有多组测试数据,对于每组数据,输出一行,给出一个正整数,是5个数中小于a的数的和。
样例输入
10 1 2 3 4 11
样例输出
10
来源
2008年北京大学图形实验室计算机研究生机试真题

题目还算简单,所以很快就写出了代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   #include <stdio.h>

int main()
{
int n;
int temp;
int result = 0;
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < 5; i++)
{
scanf("%d", &temp);
if(temp < n)
result += temp;
}

printf("%d\n", result);
}

return 0;
}

总共也就20来行,本地用题目的条件调试,也是OK的,但是提交到OJ以后,结果Wrong Answer。

想想之后发现,原来有种情况没有考虑到,如:2 3 3 3 3 3,这种输入的话,根本就没有结果,而我却输出了默认的0,但是又不知道应该输出什么,因为题目压根没提。

所以想想,原来OJ上的题目也是应该出的严密些才对,对于这种特殊情况必须要考虑到,否则做题人根本无从下手;还有就是,多给些输入输出吧,至少让做题人能够检验一些基本的边界条件,否则让人真的很郁闷。

后记:

后来发现了为什么是“Wrong Answer”了,更改后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main()
{
int n;

while(scanf("%d", &n) != EOF)
{
int result = 0;
for(int i = 0; i < 5; i++)
{
int temp;
scanf("%d", &temp);
if(temp < n)
result += temp;
}

printf("%d\n", result);
}

return 0;
}

原因就是那个temp的变量,由于是全局的,造成其所在的内存中残存数据,对后面的用例造成了影响。