【LeetCode】172. 阶乘后的零

news/2024/11/28 20:52:53/

172. 阶乘后的零(中等)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

方法一

思路

当一个数乘以 10 ,此时数字结尾会增加一个 0,因此我们可以计算 n! 能够得出多少个 10 ,就说明能得到多少个 0 。

具体对于5!,也就是 5 * 4 * 3 * 2 * 1 = 120,发现结果会有一个 0,原因就是 2 和 5 相乘构成了一个 10。而对于 10 ,其实也只有 2 * 5 可以构成,所以我们只需要找有多少对 2/5

我们把每个乘数再稍微分解下,看一个例子。

11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1

对于含有 2 的因子的话是 1 * 2, 2 * 2, 3 * 2, 4 * 2 …

对于含有 5 的因子的话是 1 * 5, 2 * 5…

含有 2 的因子每两个出现一次,含有 5 的因子每 5 个出现一次,所有 2 出现的个数远远多于 5,换言之找到一个 5,一定能找到一个 2 与之配对。所以我们只需要找有多少个 5

直接的,我们只需要判断每个累乘的数有多少个 5 的因子即可

代码

class Solution {
public:int trailingZeroes(int n) {int ans = 0;for(int i=1; i<=n; ++i){int N = i;while(N > 0){if(N % 5 == 0){ans++;N /= 5;}else break;}}return ans;}
};

优化

思路

  • 对于一个数的阶乘,就如之前分析的,5 的因子一定是每隔 5 个数出现一次,也就是下边的样子。

    n! = 1 * 2 * 3 * 4 * (1 * 5) * ... * (2 * 5) * ... * (3 * 5) *... * n

    因为每隔 5 个数出现一个 5,所以计算出现了多少个 5,我们只需要用 n/5 就可以算出来

  • 继续分析。

    ... * (1 * 5) * ... * (1 * 5 * 5) * ... * (2 * 5 * 5) * ... * (3 * 5 * 5) * ... * n

    每隔 25 个数字,出现的是两个 5,所以除了每隔 5 个数算作一个 5,每隔 25 个数,还需要多算一个 5。

    也就是我们需要再加上 n / 25 个 5。

  • 同理我们还会发现每隔 5 * 5 * 5 = 125 个数字,会出现 3 个 5,所以我们还需要再加上 n / 125 。

综上,规律就是每隔 5 个数,出现一个 5,每隔 25 个数,出现 2 个 5,每隔 125 个数,出现 3 个 5… 以此类推。

最终 5 的个数就是 n / 5 + n / 25 + n / 125 ...

写程序的话,如果直接按照上边的式子计算,分母可能会造成溢出。所以算 n / 25 的时候,我们先把 n 更新,n = n / 5,然后再计算 n / 5 即可。后边的同理。

代码

class Solution {
public:int trailingZeroes(int n) {int ans = 0;while(n > 0){ans += n / 5;n /= 5;}return ans;}
};

http://www.ppmy.cn/news/68937.html

相关文章

linux-项目部署软件安装

安装jdk 操作步骤&#xff1a; 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包&#xff0c;命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量&#xff0c;使用vim命令修改/etc/profile文…

杂记——23.java中的值传递和应用传递

这篇文章我们来讲一下java中的值传递和引用传递 结论&#xff1a;java中只存在值传递&#xff0c;不存在引用传递&#xff08;C中有引用传递&#xff09; 分析&#xff1a; 值传递(pass by value)&#xff1a;在调用函数时&#xff0c;将实际参数复制一份传递到函数中&#…

板材激光切割机切割穿孔时注意的几个问题

激光切割设备广泛应用于钣金、五金制品、钢结构、汽车配件、广告、工艺品等行业&#xff0c;成为加工行业不可缺少的环节。在厚板加工中穿孔时间占很大比重&#xff0c;随着加工板材越来越厚&#xff0c;板材激光切割机切割穿孔也会相应地增加难度。 激光切割机两种常见的穿孔方…

传统机器学习(三)聚类算法K-means(一)

传统机器学习(三)聚类算法K-means(一) 一、聚类算法K-means初识 1.1 算法概述 K-Means算法是无监督的聚类算法&#xff0c;它实现起来比较简单&#xff0c;聚类效果也不错&#xff0c;因此应用很广泛。K-Means基于欧式距离认为两个目标距离越近&#xff0c;相似度越大。 1.…

Linux - 第13节 - 网络编程套接字(二)

目录 1.简单的TCP网络程序 1.1.读取信息函数read函数和发送信息函数write函数 1.2.简单的TCP网络程序&#xff08;单进程版&#xff09; 1.3.简单的TCP网络程序&#xff08;多进程版&#xff09; 1.4.简单的TCP网络程序&#xff08;多线程版&#xff09; 1.5.简单的TCP网…

Azure API 管理缺陷突出了 API 开发中的服务器端请求伪造风险

微软最近修补了其 Azure API 管理服务中的三个漏洞&#xff0c;其中两个漏洞启用了服务器端请求伪造 (SSRF) 攻击&#xff0c;这些攻击可能允许黑客访问内部 Azure 资产。 概念验证漏洞用于突出开发人员在尝试为自己的 API 和服务实施基于黑名单的限制时可能犯的常见错误。 W…

基于html+css的图展示57

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

20230516使用python3确认三门问题

最烧脑的悖论&#xff0c;意识为什么会影响未来&#xff1f;颠覆你认知的三门问题播报文章 小红虾实验室 2023-04-09 06:08 四川 好看视频优创联盟,优质科学领域创作者 关注 对于懂概率的人来说&#xff0c;他中大奖的概率将成倍增加&#xff0c;甚至获奖率能够达到100%。 今…