martes, 12 de julio de 2011

Calcular Factorial en JAVA utilizando BigInteger y recursión

Hola, por recomendación de mi viejo amigo Phi (Hace mucho tiempo sobre como obtener el factorial de un numero en Java con BigInteger) aqui esta el código utilizando recursión y utilizando la clase BigInteger para obtener un resultado mucho mas grande. El código anterior solo pertimia obtener el factorial de un numero menor a 20! :(.

//Importo las clases necesarias
import java.math.BigInteger;
import java.io.*;


/**
* FactorialBigInteger
* Obtiene el factural de un numero ingresado por teclado, utilizando la clase
* BigInteger para no limitar el resultado a un factorial N de 20.
* @author [D-m-K]
*
*/


public class FactorialBigInteger {
public static void main(String[] args) throws IOException{
//Pido el número
System.out.println("\n\t O B T E N E R F A C T O R I A L \n");
int n = leerN("\t Ingresa el valor de N para obtener factorial : ");
BigInteger factorial = obtenerFactorial(n);

//Obtengo el factorial del número ingresado
System.out.println("\n\t [R E S U L T A D O]\n");
System.out.println("\t El factorial de " + n + " es : " + factorial);

}

/**
* @param msg - Mensaje a mostrar para solicitar el valor de entrada
* @return n - Valor ingresado de tipo entero
* @throws java.io.IOException
*/

public static int leerN (String msg) throws IOException{
int n = 0;
boolean error;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

do{
error = false;
try{
System.out.print(msg);
n = Integer.parseInt(br.readLine());
if(n < 1){
System.out.println("\t ERROR : El numero no puede ser negativo\n");
error = true;
}
}catch(NumberFormatException e){
System.out.println("\t ERROR : El valor ingresado no es numerico\n");
error = true;
}
}while(error);

return n;
}



/**
* @param n - numero a calcular
* @return fac - Factorial del numero a calcular de tipo BigInteger
*/

public static BigInteger obtenerFactorial(int n){
if(n <= 1){
return (new BigInteger("1"));
}else{
//Realizo la multiplicacion del numero n!
BigInteger fac = new BigInteger(String.valueOf(n));
return (fac.multiply(obtenerFactorial(n - 1)));
}
}
}


Ejemplo de la ejecución

O B T E N E R   F A C T O R I A L 

Ingresa el valor de N para obtener factorial : 45

[R E S U L T A D O]

El factorial de 45 es : 119622220865480194561963161495657715064383733760000000000




Salu2

5 comentarios:

  1. Hi

    Muy buen algoritmo, bastante interesante, mi pregunta, es cuando yo trato de hacer algo como 145^125 (^ = exponente), pero uso BigDecimal, me arroja infinito, existe una manera en la que pueda hacer que me muestre en pantalla el resultado? osea el número completo.

    gracias de antemano

    Bytes

    ResponderEliminar
  2. Hola, bueno para el caso de BigDecimal o BigInteger puedes utilizar el metodo pow(), el cual obtiene la potencia del numero que quieres.

    Ejemplo :

    //Declaro un BigDecimal con 145
    BigDecimal b1 = BigDecimal.valueOf(145);
    //Obtengo la potencia => 145^125 (^ = exponente) y muestro el resultado
    System.out.println("Resultado : " + (b1.pow(125)));

    Espero que te funcione.

    Salu2 ;)

    ResponderEliminar
  3. metodo para usar % en bigteger

    ResponderEliminar