Calcular el factorial de un número en Java

Factorial en java

Programa que calcule el factorial de un número entero que se introduce por teclado.

El factorial de un número se expresa mediante el carácter !. Por ejemplo, factorial de 5 se indica como 5!

El factorial de un número se calcula de la siguiente forma:

Por definición el factorial de 0 es 1: 

0! = 1

Para el resto de números el factorial se calcula multiplicando todos los números desde 1 hasta el propio número. 

1! = 1

2! = 2 * 1

3! = 3 * 2 * 1

4! = 4 * 3 * 2 * 1

En general, el factorial de un número N se calcula multiplicando:

N! = N * (N-1) * (N-2) * .... * 3 * 2 * 1

El programa mostrará por pantalla el factorial del número introducido por el usuario. Si por ejemplo se introduce un 5 el programa mostrará:

5! = 120

que es el resultado de multiplicar 5 * 4 * 3 * 2 * 1

Solución:

Para resolver este ejercicio se utilizará un bucle for para realizar las multiplicaciones desde 1 hasta N.

Las sucesivas multiplicaciones se almacenan en una variable llamada factorial que debemos inicialiar a 1 ya que la vamos a utilizar para acumular las multiplicaciones.

La variable factorial se declara de tipo double ya que el valor que se obtiene al calcular el factorial de un número es un valor que facilmente supera el rango de los números de tipo int. Por eso hay que declararla double. Si la declaramos como int podemos obtener resultados incorrectos.

Para mostrar el resultado del factorial se utiliza printf y se indica que se muestre con 0 decimales. La variable factorial es de tipo double pero el factorial de un número es un valor sin decimales, por eso se indica en el printf que muestre el resultado sin decimales, esto es, sin el .0 que mostraría por defecto.

import java.util.Scanner;

public class FactorialJava {

    public static void main(String[] args) {
        int n;
        double factorial = 1;
        Scanner sc = new Scanner(System.in);
		
        do {  //introducir por teclado un número mayor o igual a cero
            System.out.print("Introduce un numero entero >= 0: ");
            n = sc.nextInt();
        } while (n < 0);

        //multiplicar todos los números desde 1 hasta n
        //el resultado de las multiplicaciones se acumula en la variable factorial
        for (int i = 1; i <= n; i++) {
            factorial = factorial * i;
        }
		
        //mostrar el resultado
        System.out.printf("%d! = %.0f %n", n, factorial);                                                         
    }
}

En este caso hemos calculado el factorial del número dentro del propio método main. Lo normal es que el cálculo del factorial se realice mediante un método. El método recibe un número entero y calcula y devuelve su factorial. 

El método para calcular el factorial del un número es este:

//método Java para calcular el factorial de un número n
public static double factorial(int n) {
        double fact = 1;
        for (int i = 1; i <= n; i++) {                                                                            
            fact = fact * i;
        }
        return fact;
}

Utilizando el método para calcular el factorial, el programa completo que lee por teclado un número entero y calcula su factorial quedaría así:

import java.util.Scanner;

public class CalcularFactorial {

    public static void main(String[] args) {
        int n;
        Scanner sc = new Scanner(System.in);
    
        //introducir un número entero >= 0 por teclado
        do {  
            System.out.print("Introduce un numero entero >= 0: ");
            n = sc.nextInt();
        } while (n < 0);

        //calcula y mostrar el factorial del número n
        System.out.printf("%d! = %.0f %n", n, factorial(n));
    }

    //método Java para calcular el factorial de un número n
    //el método recibe el número n al que queremos calcular su factorial                                          
    //el método calcula y devuelve el factorial de n
    public static double factorial(int n) {
        double fact = 1;
        for (int i = 1; i <= n; i++) {
            fact = fact * i;
        }
        return fact;
    }

}

1 comentario: