1到100之间有50个偶数。这意味着阶乘是 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 位整数对于 fact(100) 的最低位将为 0
事实上,对于 fact(n),2 的幂数非常接近 n。事实上(10000)有 9995 次方 2。这是因为它大约是 1/2 的 n 次幂的总和,总和接近n
. 即每第二个数字是偶数n / 2,每4个有一个额外的权力2(+ n / 4),每8个有一个额外的权力(+ n / 8)等接近n
总和。