【解析】
要计算 n! 后面有多少个0,我们不妨先思考一下这里 0 的具体意义以及它产生的条件?
很明显,0 在这里代表的是一次进位,只有在计算 n! 的过程中有 10 乘入时,才会在 n! 后面出现0,所以本题就可以等价于求出在计算 n! 的过程中能分解出数字 10 的个数。而 10 是一个合数,它可以分解为两个质数之积,即 2*5 ,所以本题又可等价于求出能分解出 2 的个数和 5 的个数这两个结果之间的较小值。又因为在计算 n! 的过程中,5的倍数的数字个数是小于等于2的倍数的数字个数,所以本题最终就等价于求出从 1 到 n 的所有数字中可以分解出数字5的个数。
当 n=10000 时,有:
(1)能分解出1个数字5的个数:10000/5=2000
(2)能分解出2个数字5的个数:10000/(5*5)=400
(3)能分解出3个数字5的个数:10000/(5*5*5)=80
(4)能分解出4个数字5的个数:10000/(5*5*5*5)=16
(5)能分解出5个数字5的个数:10000/(5*5*5*5*5)=3
(6)能分解出6个数字5的个数:10000/(5*5*5*5*5*5)=0
综上所述,那么从 1 到 10000 的所有数字中一共可以分解出2000+400+80+16+3=2499
个数字5,所以 10000! 后面有 2499 个0。
public static void main(String[] args) { NiuKeTest n=new NiuKeTest(); n.Factorialdec(); } public void Factorialdec() { BigInteger result =BigInteger.ONE; BigInteger i = new BigInteger("10000"); BigInteger l = BigInteger.ONE; for (; l.compareTo(i)<=0;l=l.add(BigInteger.ONE) ) { result=result.multiply(l); } System.out.println(result); }没有什么比数数更快乐!!