Saltar al contenido

Al calcular el factorial de 100 (¡100!) Con Java usando enteros, obtengo 0

Buscamos por el mundo on line y así regalarte la respuesta a tu duda, si continúas con alguna duda puedes dejar la pregunta y respondemos con mucho gusto.

Solución:

Hay 50 números pares entre 1 y 100 inclusive. Esto significa que el factorial es un múltiplo de 2 al menos 50 veces, en otras palabras, como un número binario, los últimos 50 bits serán 0 (en realidad es más, ya que incluso el segundo número par es un múltiplo de 2 * 2, etc.)

public static void main(String... args) 
    BigInteger fact = fact(100);
    System.out.println("fact(100) = " + fact);
    System.out.println("fact(100).longValue() = " + fact.longValue());
    System.out.println("fact(100).intValue() = " + fact.intValue());
    int powerOfTwoCount = 0;
    BigInteger two = BigInteger.valueOf(2);
    while (fact.compareTo(BigInteger.ZERO) > 0 && fact.mod(two).equals(BigInteger.ZERO)) 
        powerOfTwoCount++;
        fact = fact.divide(two);
    
    System.out.println("fact(100) powers of two = " + powerOfTwoCount);


private static BigInteger fact(long n) 
    BigInteger result = BigInteger.ONE;
    for (long i = 2; i <= n; i++)
        result = result.multiply(BigInteger.valueOf(i));
    return result;

huellas dactilares

fact(100) = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
fact(100).longValue() = 0
fact(100).intValue() = 0
fact(100) powers of two = 97

Esto significa que un entero de 97 bits sería 0 para los bits de hecho más bajos (100)

De hecho, el número de potencias de dos está muy cerca de n para el hecho (n). De hecho (10000) hay 9995 potencias de dos. Esto se debe a que es aproximadamente la suma de n veces potencias de 1/2 dando un total cercano a n. es decir, cada segundo número es par n / 2 y cada cuarto tiene una potencia adicional de 2 (+ n / 4) y cada octavo tiene una potencia adicional (+ n / 8), etc. n como una suma.

Los números grandes negativos son valores que se desbordaron en ciertos rangos; factorial(100) tiene más de 32 ceros binarios al final, por lo que convertirlo en un número entero produce cero.

Para echar un vistazo a la causa, podríamos observar la factorización prima del factorial.

fac( 1) = 1             = 2^0
fac( 2) = 2             = 2^1
fac( 3) = 2 * 3         = 2^1 * 3
fac( 4) = 2 * 2 * 2 * 3 = 2^3 * 3
fac( 5) =  ...          = 2^3 * 3 * 5
fac( 6) = ...           = 2^4 * 3^2 * 5
fac( 7) = ...           = 2^4 * ...
fac( 8) = ...           = 2^7 * ...
fac( 9) = ...           = 2^7 * ...
fac(10) = ...           = 2^8 * ...
fac(11) = ...           = 2^8 * ...
...
fac(29) = ...           = 2^25 * ...
fac(30) = ...           = 2^26 * ...
fac(31) = ...           = 2^26 * ...
fac(32) = ...           = 2^31 * ...
fac(33) = ...           = 2^31 * ...
fac(34) = ...           = 2^32 * ...  <===
fac(35) = ...           = 2^32 * ...
fac(36) = ...           = 2^34 * ...
...
fac(95) = ...           = 2^88 * ...
fac(96) = ...           = 2^93 * ...
fac(97) = ...           = 2^93 * ...
fac(98) = ...           = 2^94 * ...
fac(99) = ...           = 2^94 * ...
fac(100)= ...           = 2^96 * ...

El exponente de la 2 es el número de ceros finales en la vista de base 2, ya que todos los demás factores son impares y, por lo tanto, contribuyen a 1 en el último dígito binario del producto.

Un esquema similar también funciona para otros números primos, por lo que podemos calcular fácilmente la factorización de fac(100):

fac(100) = 2^96 * 3^48 * 5^24 * 7^16 * 11^9 * 13^7 * 17^5 * 19^5 * 23^4 *
           29^3 * 31^2 * 37^2 * 41^2 * 43^2 * 47^2 *
           53 * 59 * 61 * 67 * 71 * 73 * 79 * 83 * 89 * 97

Entonces, si nuestra computadora almacena los números en base 3 y tiene 48 números trit, fac(100) sería 0 (como fac(99), también, pero fac(98) no lo haría 🙂

Te mostramos comentarios y calificaciones

Recuerda que te brindamos la opción de añadir un diagnóstico acertado si diste con la respuesta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *