首页 > 专题系列 > Java解POJ > POJ 2924 Gauß in Elementary School [解题报告] Java
2013
11-12

POJ 2924 Gauß in Elementary School [解题报告] Java

Gauß in Elementary School

问题描述 :

Johann Carl Friedrich Gauß (1777 – 1855) was one of the most important German mathematicians. For those of you who remember the Deutsche Mark, a picture of him was printed on the 10 – DM bill. In elementary school, his teacher J. G. Büttner tried to occupy the pupils by making them add up the integers from 1 to 100. The young Gauß surprised everybody by producing the correct answers (5050) within seconds.

Can you write a computer program that can compute such sums really quickly?

Given two integers n and m, you should compute the sum of all the integers from n to m. In other words, you should compute

输入:

The first line contains the number of scenarios. Each scenario consists of a line containing the numbers n and m (−109nm ≤ 109).


输出:

The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print the sum of all integers from n to m. Terminate the output for the scenario with a blank line.

样例输入:

3
1 100
-11 10
-89173 938749341

样例输出:

Scenario #1:
5050

Scenario #2:
-11

Scenario #3:
440625159107385260

解题代码:

import java.util.*;   
import java.math.*;   
  
public class Main {   
  
    public static void main(String[] args) {   
        Scanner cin = new Scanner(System.in);   
           
        int num = Integer.valueOf(cin.nextLine()).intValue();   
           
        for(int i = 0; i < num; i++)   
        {   
            String[] str = cin.nextLine().split(" ");   
            BigInteger a = new BigInteger(str[0]);   
            BigInteger b = new BigInteger(str[1]);   
            BigInteger result = new BigInteger("0");   
               
            if((a.intValue() >= 0 && b.intValue() >= 0)    
                    || (a.intValue() < 0 && b.intValue() < 0))   
            {   
                int times = (Math.abs(b.intValue()-a.intValue())+1);   
                result = result.add(a);   
                result = result.add(b);   
                result = result.multiply(new BigInteger(times + ""));   
                result = result.divide(new BigInteger("2"));   
            }   
            else  
            {   
                int times1 = (Math.abs(b.intValue()-0)+1);   
                BigInteger r1 = new BigInteger("0");   
                r1 = r1.add(b);   
                r1 = r1.multiply(new BigInteger(times1 + ""));   
                r1 = r1.divide(new BigInteger("2"));   
                   
                int times2 = (Math.abs(a.intValue()-0)+1);   
                BigInteger r2 = new BigInteger("0");   
                r2 = r2.add(a);   
                r2 = r2.multiply(new BigInteger(times2 + ""));   
                r2 = r2.divide(new BigInteger("2"));   
                   
                result = r1.add(r2);   
            }   
       
            System.out.println("Scenario #" + (i+1) + ":");   
            System.out.println(result.toString());   
            if(i != num-1)   
                System.out.println();   
        }   
  
    }   
  
}

  1. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  2. 算法是程序的灵魂,算法分简单和复杂,如果不搞大数据类,程序员了解一下简单点的算法也是可以的,但是会算法的一定要会编程才行,程序员不一定要会算法,利于自己项目需要的可以简单了解。