HDUOJ-1001: 計算從1到n的和

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

顯而易見,這種錯誤就是說程序的輸出結果是不正確的。剛開始的時候我用的是下面的數學公式去計算結果的。
1到n的和的公式
在上面的源代碼中,我註釋掉的方法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 打字機上卷一行的動作

發佈了27 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章