Leetcode 172.阶乘后的零

Leetcode 172.阶乘后的零

题目描述

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

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

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

说明: 你算法的时间复杂度应为 O(log n) 。

解题思路

题目要求算的是阶乘过后的数中零的数量,

  1. 阶乘的增长速度很快,如果阶乘到int型的最大范围,那将会是一个很大很大的数,所以通过先求结果,在求数字中的零的个数是行不通的

  2. 要求结果中零的个数,其实是由2和5相乘得到的,我们只需要统计2和5的个数,然后去最小的那个数,就是零出现的个数;这里没有数学证明,只是稍微口述一下,2是每隔两个数都会出现一次,而5是每隔五个数出现一次,所以就可以直接变成统计5出现的次数,可以写出下面代码:

    class Solution {
    public:
        int trailingZeroes(int n) {
            int numOfZeros = 0;
    
            while(n>0){
                numOfZeros += numOf5(n) ;
                n--;
            }
            
            return numOfZeros;
        }
        int numOf5(int num){
            int count = 0;
            while((num > 1) && (num%5 == 0)){
                count ++;
                num /= 5;
            }
            return count;
        }
    };
    

    虽然是做了优化,但是提交的时候还是==超时==了

  3. 求n! 参考链接
    0的来源 2 * 5 所以一对2和5即可产生一个0,所以0的个数即为min(阶乘中5的个数和2的个数)
    又因为是2的倍数的数一定比是5的倍数的数多 所以2的个数一定>=5的个数 所以只需要统计 5 的个数了
    例如 5! = 1 * 2 * 3 * 4 * 5
    一个2和一个5配对出现0 所以5!末尾只有一个零
    而在 n = 25 时 可以产生5的有 5 10 15 20 25
    即 n/5 = 5个 然鹅 25 = 55 所以少算了一个5
    n>=25时,故而需要补上 因此所有可以产生25的也要加上
    即为 n/5 + n/25 然鹅 625 = 25
    25 所以又少算了一个25
    继续补上…
    所以最终为 n/5 + n/25 + n/625 +…
    即 n/5 + n/5/5 + n/5/5/5 + …

代码如下:

class Solution {
public:
    int trailingZeroes(int n) {

        int numOfZeros = 0;

        while(n){
            numOfZeros += n/5;
            n /= 5;
        }
        return numOfZeros;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值