Есть 50 четных чисел от 1 до 100 включительно. Это означает, что факториал кратен 2, по крайней мере, 50 раз, другими словами, в качестве двоичного числа последние 50 бит будут равны 0. (На самом деле это больше, так как четное второе четное число кратно 2 * 2 и т. Д.)
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;
}
печать
fact(100) = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
fact(100).longValue() = 0
fact(100).intValue() = 0
fact(100) powers of two = 97
Это означает, что 97-разрядное целое число будет 0 для младших битов факта (100)
Фактически, число степеней двух очень близко к n для факта (n). Для факта (10000) существует 9995 степеней двух. Это потому, что это приблизительно сумма n-кратных степеней 1/2, что дает общее значение, близкое к n
. то есть каждое второе число является четным n / 2, и каждое четвертое имеет дополнительную степень 2 (+ n / 4), а каждое восьмое имеет дополнительную степень (+ n / 8) и т. д., приближается к n
как сумма.