前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣算法题:阶乘后的零

力扣算法题:阶乘后的零

作者头像
半月无霜
发布2023-03-03 14:43:25
3060
发布2023-03-03 14:43:25
举报
文章被收录于专栏:半月无霜半月无霜

阶乘后的零

一、介绍

此题出自力扣网题库第172题,我刚开始没有想到,后面看了题解才明白的。

先看看题目,讲得很简单

image-20220326174614333
image-20220326174614333

还有入参的限制,0 <= n <= 104

代码语言:javascript
复制
class Solution {
    public int trailingZeroes(int n) {
		// TODO ...
    }
}

放一个计算器,一会自己可以看看规律

输入数字n: 计算 结果:1

二、解题思路

1)暴力解析

暴力解析,算出答案,再转字符串,计算出末尾零的个数。

这种方法想都不要想,这可是阶乘,数字量很大的,很容易溢出。不然上面用计算器来试试。

2)优化

不知道你用计算器试过了没有,也不知道你有没有得到规律,我们先一步一步来分析

  1. 首先要看这道题想要的结果是什么,是零的个数
  2. 再看题目,阶乘阶乘,里面都是乘法计算,所以想要得到零,必须要乘上10,那么这个10就是因子
  3. 思路到这,第一步就清除了,查询n中有多少个10或者10的倍数,就有多少个零

然而,当你用计算器去试了一下,结果发现,5! = 120,这也有一个零

  1. 思维再次扩展,可以发现5*偶数=10的倍数的,这样一来因子是5,而不是10
  2. 由于偶数很多,所以我们只需要计算出n中有多少个5的倍数这样的数,就可以正确得到答案了
代码语言:javascript
复制
public int trailingZeroes(int n) {
    int count = n / 5;
    return count;
}

思维发散至这里,已经很强了,但还不够!!!因为25! = 15511210043330985984000000,足足有6个0,这是为什么???

  1. 如果只是遍历5的倍数,算出总共有多少5因子的倍数的话,还是不够的
  2. 但要注意25这个数,是由5*5而来,要多算一个零。同理125,是由5 * 5 * 5 而来,再多算一个零
  3. 按照步骤2,我们需要 (n/5) + (n/25) + (n/125) + … ​
  4. 可以对步骤3的公式进行优化,提取出n/5,来进行计算,直到n小于5为止,所以就得到了下面这个答案
代码语言:javascript
复制
class Solution {
    public int trailingZeroes(int n) {
        int count = 0;
        while(n >= 5) {
            count += n / 5;
            n /= 5;
        }
        return count;
    }
}

三、最后

这道题,我拿到确实懵逼了,直到看完题解才恍然大悟,只能大声高呼,牛逼。

我是半月,祝你幸福!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 阶乘后的零
    • 一、介绍
      • 二、解题思路
        • 1)暴力解析
        • 2)优化
      • 三、最后
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档