LeetCode 172.FactorialTrailingZeroes(阶乘后的零)

GitHub链接
简书链接
CSDN链接

题目

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

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

示例2

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

说明: 算法的时间复杂度应为 O ( l o g n ) O(log n) O(logn)

方法一(错误的)

求出 n ! n! n! 的值或者在求的过程中,遇到末尾有0,先除以10来减小数,虽然该算法原理上可以行,但是有两个问题,一、时间复杂度为 O ( n ) O(n) O(n),二、结果不对,出现这个问题的原因是编程语言每种类型有自己的数组范围,因此会溢出。所以该方法实际不可行

方法二

考虑一个问题,位数为零是由2*5产生的,而吧每个数分解,出现5的次数必出现2的次数要少很多,因此,我们通过统计有多少个 5 即可判断尾数有多少个 0.先上代码在将原理

public class LeetCode_172 {
    public int trailingZeroes2(int n) {
        int count = 0;
        while (n > 0) {
            count += n / 5;
            n /= 5;
        }

        return count;
    }

    public static void main(String[] args) {
        LeetCode_172 leetCode = new LeetCode_172();
        System.out.println(leetCode.trailingZeroes(3));
        System.out.println(leetCode.trailingZeroes(5));
        System.out.println(leetCode.trailingZeroes(16));
    }
}

首先我们先统计n 包含一个5的个数,然后统计包含两个5的个数,依次类推。比如:35!,包含一个5的个数为5,10, 15, 20, 25, 30, 35,即35/5 = 7个,然而当我们遇到25的元素时,里面包含两个5,所以通过 n / 5 2 n/5^2 n/52 ,更大的数一次类推,当 5 k > n 5^k > n 5k>n时即停止,在上面代码中表现为n>0;

致谢

感谢大家的阅读和支持, 欢迎大家上星..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值