leetcode题目 172. 阶乘后的零

题目

给定一个整数 n,返回 n! 结果尾数中零的数量。

示例

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

思路

题目要求我们找出末尾0的个数,唯有10可以直接在末尾添0,而10=2*5,所以等价于找出阶乘因式分解中2与5的对数,2的个数远多于5(后面给出证明),所以又变换为找5的个数。

证明:2的个数远多于5
对于任意一个数,假设它是5的倍数,那么可以表示为5k x p,这个时候我们可以找到一个数2k x p,很显然前者大于后者,所以对于每一个5的倍数的值,我们都可以找到相同个数的2与之匹配。

代码

public class problem172 {
	/*
	 * 找0的个数,其实就是找因式分解中2*5的对数,然而2的个数远多于5
	 * 所以等价于找5个个数
	 */
	public int trailingZeroes(int n) {
		//5提供一个因式分解的5,25提供两个,125提供三个
		//第一个循环中,我们找出5的倍数的个数,其中也包括的25,125等数
		//但这个时候我并没有直接减去多余的,而是继续累加
		//下一次循环中,我们继续除5(两次相当于除25),这个时候继续累加
		//但我们可以看见,我们并没有乘以权值(其实25的5的个数为2,即权值为2)
		//因为在上一层循环中,我们并没有减去25的倍数,相当于提前把这一层的权值加了一部分上去
        int count=0;
        while(n>0){
        	count+=n/5;
        	n=n/5;
        }
        return count;
    }
	public static void main(String[] args) {
		problem172 pro=new problem172();
		System.out.println(pro.trailingZeroes(28));
	}
}

解释的好像很潦草,将就看吧,语言组织能力太差了…

发布了48 篇原创文章 · 获赞 0 · 访问量 721

猜你喜欢

转载自blog.csdn.net/qq_36360463/article/details/104263662