题解 | #阶乘末尾0的数量#

阶乘末尾0的数量

http://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8

阶乘末尾0的数量

问题描述:给定一个非负整数 N,返回N! 结果的末尾为 0的数量。
示例1
输入:3
返回值:0
说明:3!=6
示例2
输入:1000000000
返回值:249999998

方法一

思路分析

      通过观察我们发现每一组阶乘会产生0的原因是因为存在,一个非负整数的阶乘的末尾0的个数,只需要找到质数相乘的因子中2和5的个数,但由于连续的两个数就存在一个2的因子,因此n的阶乘末尾0的个数只需要找到1~n之间5的个数即可。因此方法是从n开始找到n中质数相乘因子中5的个数,一次遍历到1,但是这种方法时间复杂度高。因此我们让n除以5得到其个数,特别的当有多个因子5时,需要不断的除以5直到n为0为止,在代码中使用while循环,每次将整除后的数赋值给n,直到n为0运行结束。

实例分析

例如:     末尾0的个数有2个,因为存在2个5
           末尾0的个数有2个,因为存在2个5
由此我们可以得出只需要找到阶乘中5的个数即可解决问题,即n除以5得到其个数,特别的当有多个因子5时,需要不断的除以5直到n为0为止,在代码中使用while循环,每次将整除后的数赋值给n,直到n为0运行结束。

C++核心代码

class Solution {
public:
    /**
     * the number of 0
     * @param n long长整型 the number
     * @return long长整型
     */
    long long thenumberof0(long long n) {
        // write code here
        long long sum = 0;
        long long base =5;
        while(n)
        {
            sum += n/5;//计算n分解成质数相乘因此中5的个数
            n /= 5;
        }
        return sum;
        
    }
};

复杂度分析

  • 时间复杂度:n不断的除以5寻找次数,因此时间复杂度为
  • 空间复杂度: 借助一个辅助变量,空间复杂度为$O(1)$

方法二

思路分析

      上面的方法也可以使用递归的思想实现,设置函数$F(n!)$表示n的阶乘末尾0的个数,那么其表达式为$F(n!)=n/5+F((n/5)!)$,因此产生递归的方程,而递归结束的条件为n/5为0,即$n<5$返回0。因此递归公式为:
$n<5 ,  F(n!)=0$
$n>=5, F(n!)=n/5+F((n/5)!)$

实例分析

$F(100!)=100/5+F((100/5)!)=20+F(20!)=20+4+F(4!)=24$
$F(1000!)=1000/5+F((1000/5)!)=200+F(200!)=240+F(40!)=248+F(8!)=249+0=249$

C++核心代码

class Solution {
public:
    /**
     * the number of 0
     * @param n long长整型 the number
     * @return long长整型
     */
    long long thenumberof0(long long n) {
        // write code here
        if(n<5)//递归结束的条件
            return 0;
        else
            return (n / 5 + thenumberof0(n / 5));//向下递归,不断的整除5
    }
};

复杂度分析

  • 时间复杂度:递归的时间复杂度为:递归总次数*每次递归的数量,递归总次数为,每次递归一次,因此时间复杂度为
  • 空间复杂度:递归的深度*每次递归的空间复杂度,本题中递归深度为递归次数,因此空间复杂度为
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4018次浏览 46人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16907次浏览 137人参与
# 米连集团26产品管培生项目 #
7310次浏览 226人参与
# 春招至今,你的战绩如何? #
15816次浏览 145人参与
# 你的实习产出是真实的还是包装的? #
3098次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 巨人网络春招 #
11527次浏览 224人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178339次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76981次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64760次浏览 890人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364353次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务