【LeetCode】:面试题 16.05. 阶乘尾数

🎁个人主页:我们的五年****

🔍系列专栏:C++课程学习****

🎉欢迎大家点赞👍评论📝收藏⭐文章

好久没有写文章了,今天碰见了一道有趣的题目,写下来分享一下。

🏆1.问题描述:

🏆2.问题分析:

🎲优化一:

首先看到这道题的时候,暴力肯定是不行的,n的阶乘可能会是一个很大的数,肯定是会超过int,long long的范围的。
然后再去想其他的方法优化,n的阶乘:1*2*3*......*n。两个数相乘,尾部要新增0,这两个数的最低位的非0必须是(2*5)(4*5)(6*5)(8*5),从这里面可以看出全部都有 5,而且其他的是2的倍数,其实最重要的还是2*5,其他的相乘不会新增0。
一个2和一个5相乘就会在尾部新增一个 0。所以我们计算 1到n之间有个2和5,然后取2和5的最小的个数,就是最后尾部的0的个数。

比如:4*5*5*5=2*2*5*5*5

这里面有2个为2的因子,3个为5的因子,所以一共有2对(2,5);最后尾部就有2个0。

🎲优化二:

如果根据上面的通过循环计算2和5的个数 ,这样的算法的时间复杂度肯定是要大于logn的,那就会发生时间超限。

然后我们必须在进行优化计算2和5的个数的算法。


我们先来看看不管n是多少,1~n之间,2的因子肯定是要>=5的因子。

所以我们最后只要计算有多少个5,尾部就有多少个0。


🎬1.每五个数中,就有一个是5的倍数。这些都包含一个以上为5的因子。

n/5=n1。

🎬2.但是25有2个5,在25也是5的倍数,计算过一次5,这里也只需要计算一个。

n/25=n2。

🎬125中有3个5,125是5的倍数5的倍数的时候计算过一次,125是25的倍数,在25的时候也计算过一次。最后也只需要计算一次就可以了。

n/125=n3

......

直到计算超过n

最后n1+n2+n3......就是5的个数。

🏆3.实现代码:

一:

复制代码
class Solution {
public:
    int trailingZeroes(int n) {
        int num=0;
        while(n){
            num+=n/5;
            n/=5;
        }
        return num;
    }
};

二:

复制代码
class Solution {
public:
    int trailingZeroes(int n) {
        int num=0;

        //最后面i*5的返回可能超过int
        long long i=5;
        for(;i<=n;i*=5)
        {
            num+=n/i;
        }
        return num;
    }
};
相关推荐
wxin_VXbishe10 分钟前
springboot新能源车充电站管理系统小程序-计算机毕业设计源码29213
java·c++·spring boot·python·spring·django·php
风萧萧199916 分钟前
问答样例如何在RAG问答中使用?
算法
七夜zippoe20 分钟前
DolphinDB分区策略:HASH分区与COMPO分区
算法·哈希算法·hash·dolphindb·compo
沪漂阿龙1 小时前
程序员面试技术爆款文:2026大厂算法通关手册——从零基础到LeetCode刷穿,这一篇就够了
算法·leetcode·面试
05候补工程师1 小时前
【408 从零到一】线性表逻辑特征、存储结构对比与 C/C++ 动态内存分配避坑指南
c语言·开发语言·数据结构·c++·考研
rit84324992 小时前
基于博弈论的小区分簇算法MATLAB实现
开发语言·算法·matlab
华清远见成都中心2 小时前
C 语言内存管理深度解析:malloc/free 与嵌入式堆栈分配策略
java·c语言·算法
怕什么真理无穷2 小时前
C++面试5_ TCP 粘包2(工业级)
开发语言·c++·tcp/ip
一行代码一行诗++2 小时前
关系操作符
算法
努力努力再努力wz2 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql