题目描述
给一个整型数,求出该数阶乘结果中尾部包含多少个零
解题思路
思路一:通过BigInteger计算出阶乘的结果,然后在进行判断。
思路二:尾部出现零的原因是什么呢?必然是乘了10这样的数,而10的因数有2和5,我们可以选取最大的一个来计算,即每增加5尾部就会出现一个零,即n/5;但是同时也需要注意100,1000的这种情况依次增加两个或更多的零,将之按照同样的方法,100有25和4与1000有125和8因数,因此可以计算出最后的结果而实现了高效。
代码实现
package _test;
import java.math.BigInteger;
public class Test002 {
public static void main(String[] args) {
//BigInteger计算阶乘
System.out.println(factorial(105));
//计算阶乘结果中尾部有多少个零
System.out.println(hasZero(105));
}
/**
* 求出某数阶乘后结果的结尾含有多少个零
* @param n
* @return
*/
static long hasZero(long n){
long count = 0;
/**
* 解题思路:
* 1、数与数相乘时,只有乘以10这种数才会增加零在尾
* 部,而10的因数有2和5两个,我们选择较大的5来计算,即n/5
* 2、但是有存在100,1000。。。。这种,而100可分解乘4和25,
* 1000可分解乘125。。。。这样依次类推下去即可。
*/
for(int i = 1; Math.pow(5,i) <= n; i++) {
count += n / (long)Math.pow(5,i);
}
return count;
}
/**
* 利用Java中的bigInteger来求阶乘
* @param n
* @return
*/
static BigInteger factorial (long n){
BigInteger bi = new BigInteger(String.valueOf(n));
for (long i = n; i >= 1; i--) {
bi = bi.multiply(BigInteger.valueOf(i));
}
return bi;
}
}