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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章