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.