Challenge 1: Super Hard Sum

_________________________________________________________________________
Your amazing program should calculate the sum if the numbers given in each line, and output on line for each question with the response. Numbers can be negative, really big and lines contain extra spaces, so make your program resistant to input.

Your program will need to read from standard input, line by line till the end of the input. Consider each line a different question. For each line you read, output the sum of all the given numbers.

Sample input

2 3 4 5 -1

Sample output

5 8

_________________________________________________________________________

UserInterface Class:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Clase encargada de mantener el bucle de ejecución del programa hasta el fin de linea.
 * @author Javier de Pedro López
 */
public class UserInterface {

    /**
     * Permite mantener el bucle de lecutra.
     */
    public void run() throws IOException{
        String line;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        //Bucle que realiza las lecturas hasta que lo recibido sea EOF (null)
        do{
            line = reader.readLine();
            if  (line != null && !line.trim().equals("")){
                SuperHardSum sum = new SuperHardSum(line);
                System.out.println(sum.getSum());
            }
        } while(line != null);
    }
}

SuperHardSum Class:

import java.math.BigInteger;
import java.util.StringTokenizer;

/**
 * Realiza la suma de una linea completa
 * @author Javier de Pedro López
 */
public class SuperHardSum {

    //ATRIBUTOS//
    private BigInteger _sum;

    //CONSTRUCTOR//
    /**
     * Instancia un nuevo elemento para realizar sumas por linea.
     * @param line linea sobre la que se realiza la suma.
     */
    public SuperHardSum(String line){
        _sum = new BigInteger("0");
        StringTokenizer tokens = new StringTokenizer(line, " ");
        while(tokens.hasMoreElements()){
            StringTokenizer tokenProc = new StringTokenizer(tokens.nextToken(),"+");
            _sum = _sum.add(new BigInteger(tokenProc.nextToken()));
        }
    }

    /**
     * Permite obtener la suma de toda la linea.
     * @return la suma de toda la linea.
     */
    public BigInteger getSum(){
        return _sum;
    }
}

En la línea resaltada podemos ver que se trata de convertir en tokens con el símbolo ‘+’, esto es porque en los tests se prueban números como +numero, y eso produce un error al tratar de convertirlo en BigInteger. De este modo quedan eliminados todos los + que puedan aparecer en las pruebas.

2 pensamientos en “Challenge 1: Super Hard Sum

  1. Comment copied from other entry
    feantury
    on junio 20, 2011 en 10:34 pm said: [Edit]
    El código lo dejaré escrito de la misma manera que está de todos modos, puesto que la idea es dejar reflejado el trabajo que realicé en el concurso.
    En cuanto a lo de los estándares java, así es como me obligan en la facultad por eso lo sigo, y la verdad resulta muy visible. =)
    Lo del StringTokenizer no lo sabía, así que una cosa más a tener en cuenta.
    Y la inicialización… metida de pata
    No obstante, muchas gracias por los apuntes.

    Un saludo.

  2. Comment copied from other entry
    CC on junio 20, 2011 en 10:26 pm said: [Edit]
    Unas notas
    Nombrar un atributo empezando por _ no entra dentro del estandar Java para el nombre de las variables.
    StringTokenizer se queda desfasado ante la introduccion de la clase Scanner de Java5
    new BigInteger(“0″) -> BigInteger.ONE;

    salu2

$- Leave your comment

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s