题目
给定一个整数 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));
}
}
解释的好像很潦草,将就看吧,语言组织能力太差了…