Método para Calcular Factorial en Java
- Obtener factorial usando el método iterativo en Java
- Encuentra factorial usando el método recursivo en Java
- Encuentra factorial usando el enfoque dinámico en Java
- Encuentra factorial usando Apache Commons en Java
- Encontrar el factorial usando Java 8 Streams
-
Encuentra factorial usando
BigInteger
en Java -
Encuentra factorial usando la biblioteca
BigIntegerMath
Este tutorial presenta los métodos y ejemplos de código para calcular factorial en Java.
El factorial de un número n
es la multiplicación de todos los números naturales entre 1
y n
. En este tutorial, veremos diferentes formas de calcular el factorial de un número.
Primero veremos cómo se puede calcular el factorial de los números inferiores e iguales a 20
. Esta segregación se debe a la gama limitada de tipos de datos longs de Java.
Los factoriales de números por encima de 20
son demasiado grandes para caber en el rango de los longs.
Obtener factorial usando el método iterativo en Java
En este ejemplo, creamos una variable, store_fact
, de tipo long y la inicializamos con 1
.
Luego recorremos todos los enteros desde 1
hasta el número cuyo factorial se calcula y multiplicamos el valor de la variable de bucle con el valor store_fact
. Almacenamos el valor calculado en la variable store_fact
y actualizamos la variable de bucle.
Para hacer más claro el algoritmo anterior, podemos escribirlo así:
- inicializar
n
- inicializar
store_fact = 1
- hacer
for i = 1
an
store_fact = store_fact*n
- incremento
i
- devolver
store_fact
En el algoritmo anterior, la variable store_fact
almacena el factorial de n
de la siguiente manera:
- Después de la primera iteración:
store_value = 1 = 1!
- Después de la segunda iteración:
store_value = 1 X 2 = 2!
- Después de la tercera iteración:
store_value = 1 X 2 X 3 = 3!
- Después de la n-ésima iteración:
store_value = 1 X 2 X 3 X 4 ........ Xn = n!
Veamos ahora el ejemplo de código para el algoritmo anterior.
import java.util.Scanner;
public class SimpleTesting {
static long factCalculator(int n) {
long store_fact = 1;
int i = 1;
while (i <= n) {
store_fact = store_fact * i;
i++;
}
return store_fact;
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
}
}
Producción :
Enter a number:
4
24
Encuentra factorial usando el método recursivo en Java
El método iterativo anterior se puede transformar en un método recursivo para encontrar el factorial de cualquier número. En este método, tomamos el caso base como:
if (n == 0 || n == 1) {
return 1;
}
Si la condición base no se cumple, devuelve:
n* factCalculator(n - 1);
Veamos el ejemplo de código a continuación. Usamos un método recursivo, factCalculator()
, para encontrar el factorial.
import java.util.*;
public class SimpleTesting {
static long factCalculator(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factCalculator(n - 1);
}
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
}
}
Producción :
Enter a number:
4
24
Encuentra factorial usando el enfoque dinámico en Java
También podemos calcular el factorial de un número utilizando el enfoque de programación dinámica. Este método es más rápido que otros métodos, ya que almacena el factorial de números más pequeños y calcula los factoriales de números más grandes usando esos factoriales.
Por ejemplo:
- 5! = 5 X 4!
- 4! = 4 X 3!
- 3! = 3 X 2!
- 2! = 2 X 1!
- 1! = 1 X 0!
- 0! = 1
En este método, creamos una tabla de búsqueda. Esta tabla almacena los factoriales de los números del 0
al 20
.
Creamos la tabla de búsqueda hasta 20
solo porque es el número más grande cuyo long factorial puede almacenar. Inicializamos 0!
como 1
.
Luego usamos el valor 0!
para calcular 1!
, el valor de 1!
para calcular 2!
y así. Mira el código a continuación:
import java.util.*;
public class SimpleTesting {
static long[] factCalculator() {
long[] fact_table = new long[21];
fact_table[0] = 1;
for (int i = 1; i < fact_table.length; i++) {
fact_table[i] = fact_table[i - 1] * i;
}
return fact_table;
}
public static void main(String args[]) {
long[] table = factCalculator();
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(table[number]);
}
}
Producción :
Enter a number:
5
120
Encuentra factorial usando Apache Commons en Java
Si trabajas con la librería Apache Commons Math, usa la clase CombinatoricsUtils
con un método factorial()
. Es un método incorporado para calcular el factorial de cualquier número.
El valor devuelto por este método es de tipo long; por tanto, no podemos calcular el factorial de números mayores de 20
. Vea el ejemplo a continuación.
import java.util.Scanner;
import org.apache.commons.math3.util.CombinatoricsUtils;
public class SimpleTesting {
static long factCalculator(int n) {
return CombinatoricsUtils.factorial(n);
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
}
}
Producción :
Enter a number:
5
120
Encontrar el factorial usando Java 8 Streams
También podemos usar la API de flujo de Java 8 para calcular el factorial de un número. Primero crearemos una secuencia de números del 1
al n
, donde n
es el número cuyo factorial se calcula.
Luego usamos el método reduce para realizar la operación de reducción en los elementos. Pasamos 1
como elemento identidad y la multiplicación como función de acumulación asociativa.
Mira el código a continuación:
import java.util.*;
import java.util.stream.LongStream;
public class SimpleTesting {
static long factCalculator(int n) {
return LongStream.rangeClosed(1, n).reduce(1, (long num1, long num2) -> num1 * num2);
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
}
}
Producción :
Enter a number:
5
120
Hay una gran ventaja de usar la función reduce()
sobre el método iterativo o recursivo. La operación reduce()
es paralelizable si la función utilizada para procesar los elementos es asociativa.
Ahora, calcularemos el factorial de los números por encima de 20
.
Encuentra factorial usando BigInteger
en Java
La clase BigInteger
se usa para manejar números muy grandes más allá del rango de tipos de datos primitivos. Podemos usar BigInteger
para almacenar el valor de factoriales de números por encima de 20
.
Vea el ejemplo a continuación.
import java.math.BigInteger;
import java.util.Scanner;
public class SimpleTesting {
static BigInteger factCalculator(int n) {
BigInteger store_fact = BigInteger.ONE;
for (int i1 = 2; i1 <= n; i1++) {
store_fact = store_fact.multiply(BigInteger.valueOf(i1));
}
return store_fact;
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
scan.close();
}
}
Producción :
Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000
Como no podemos multiplicar BigInteger
usando el operador *
, usamos la función multiply()
. Este método es como el método iterativo, excepto que usamos BigInteger
en lugar de long.
Encuentra factorial usando la biblioteca BigIntegerMath
La biblioteca BigIntegerMath
tiene un método factorial()
integrado, que se puede utilizar para calcular el factorial de un número. Es un método estático y devuelve un valor de tipo long.
Vea el ejemplo a continuación.
import com.google.common.math.BigIntegerMath;
import java.util.*;
public class SimpleTesting {
static long factCalculator(int n) {
return BigIntegerMath.factorial(n);
}
public static void main(String args[]) {
int number;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a number: ");
number = scan.nextInt();
System.out.println(factCalculator(number));
}
}
Producción :
Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000