阶乘后的零


题目:

给定一个整数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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值