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 打字機上卷一行的動作