题目:
给定一个整数n,返回n!结果中尾随零的个数。n>0
示例1:
输入:n=3
输出:0
解释:3!=6,不含尾随0
示例2:
输入:n=5
输出:1
解释:5!=120,有一个尾随0
思路:
阶乘 尾随0的个数
1!= 1 =1 0
2!= 2 * 1 = 2 0
3!= 3 * 2 * 1 = 6 0
4!= 4 * 3 * 2 * 1 = 24 0
5!= 5 * 4 * 3 * 2 * 1 = 120 1
6!= 6 * 5 * 4 * 3 * 2 * 1 = 720 1
n! = n * (n-1) * (n-2) * ... * 1 ?
通过列举几项数据的阶乘后,我们发现尾随0的产生存在两种情况产生的:1、5和偶数相乘或者本身带有0,除了0本身之外,其他的带有0的肯定也是5的倍数,又因为5的因子个数肯定小于偶数,所以只要从阶乘中算出5的次方数就可以得出尾随0的个数。结论:5的次方数即为尾随0的个数
那现在的问题转化为n!中5的次方数怎么获得?
n! = n * (n-1) * (n-2) * … * 1
递归算法:如果n大于5 我们可以通过 n/5的结果来判断 n 到 1中间的有多少5的倍数的个数,再次递归再判断n/5的结果是否继续还是5的倍数,n/5的结果还大于1则说明中间还有5的倍数,再次得到的n/5为第二次递归获得的5的次数数,不断递归下去就可以得到5的总的次方数
举例说明:
30! = 2.6525285981219e+32
第一步:30/5 = 6 说明30 * … * 5 中间在第一次递归算法,5的倍数有6个(56,55,54,53,52,51),此时5的次数方数为6,
第二步: 6/5=1 说明30*… * 5 中间的因子在第一次递归消耗完一个5的子因子后,还存在1个5的倍数的因子(6/5=1:5*5中还有一个5)
第三步: 1/5=0则几次递归消耗完5的因子后不再存在5的倍数了
所以尾随0个数:6+1=7
代码:
/**
* 题目:
* <p>
* 给定一个整数n,返回n!结果中尾随零的个数。n>0
* <p>
* 示例1:
* <p>
* 输入:n=3
* <p>
* 输出:0
* <p>
* 解释:3!=6,不含尾随0
* <p>
* 示例2:
* <p>
* 输入:n=5
* <p>
* 输出:1
* <p>
* 解释:5!=120,有一个尾随0
*
* @author xukaijun5
* @since 2021/11/1
**/
public class Day20211101 {
public static int trailingZeroes(int n) {
int count = 0;
while (n > 0) {
count += n / 5;
n /= 5;
}
return count;
}
public static void main(String[] args) {
System.out.println(trailingZeroes(30));
}
}