1. 题目: Sum from 1 to n [Click it for more details]
2. 我的解答:
import java.io.*;
public class Main
{
public static int sumOneByOne(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum+=i;
}
return sum;
}
/*
public static int sumByFormula(int n) {
return (n*(n+1))/2;
}*/
public static void main(String[] args) throws Exception
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int a, b;
while(in.nextToken() != StreamTokenizer.TT_EOF)
{
a = (int)in.nval;
out.println(sumOneByOne(a));
out.println();
}
out.flush();
}
}
3. 出现的问题与原因解析
3.1 Wrong Answer
显而易见,这种错误就是说程序的输出结果是不正确的。刚开始的时候我用的是下面的数学公式去计算结果的。
在上面的源代码中,我注释掉的方法sumByFormula就是我一开始用的解题方法。但是该方法有个问题,就是当它计算n乘以(n+1)时,这会比一个一个地累加,会更快地溢出。Online Judge的测试用例估计会测试比较大的数。所以,Online Judge系统会判定为 Wrong Answer.
从中获得的经验:
- sumOneByOne虽然效率不如sumByFormula, 但是它能够处理的数据范围却更大。
3.2 Presentation Error
这个是因为我受了题中输出示例的影响,以为最后那个结果的后面没有额外的一个空行。无论如何,如下的格式是期望的,
开始我的程序的输出时下面错误的格式:
获得的经验:
- 空行本质上就是就是CRLF.(在Windows系统上)
- CR LF是打印机的概念。其中, CR:carriage return 打字头归位的动作; LF: Line Feed 打字机上卷一行的动作