Lintcode 2、尾部的零

题目描述

给一个整型数,求出该数阶乘结果中尾部包含多少个零

解题思路

思路一:通过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;
    }
}

发布了28 篇原创文章 · 获赞 5 · 访问量 2192

猜你喜欢

转载自blog.csdn.net/qq_40307379/article/details/104885463