【面试经典 150 | 数学】阶乘后的零

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:数学+优化计算
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【数学-阶乘】


题目来源

172. 阶乘后的零


题目解读

给你一个整数 n,求出 n! 的结果中尾部 0 的数量,其中:

n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 3 ∗ 2 ∗ 1 n!=n*(n-1)*(n-2)*...*3*2*1 n!=n(n1)(n2)...321


解题思路

学习 官方题解.

方法一:数学+优化计算

n! 尾零的数量即为 n! 中因子 10 的个数,而 10 = 2 x 5,因此转换成求 n! 中质因子 2 的个数和 质因子 5 的个数的较小值。

由于质因子 5 的个数不会大于质因子 2 的个数(证明如下),我们可以仅考虑质因子 5 的个数 。n! 中质因子 5 的个数等于 [1, n] 的每个数的质因子 5 的个数之和,我们可以遍历 [1, n] 的所有 5 的倍数求出。

代码 1

class Solution {
public:int trailingZeroes(int n) {int cout_5 = 0;for (int i = 5; i <= n; i += 5) {int cur = i;while (cur % 5 == 0) {cout_5++;cur /= 5;}	}return cout_5;}
};

证明

[1, n]p 的倍数有 n 1 = ⌊ n p ⌋ n_1= \lfloor{\frac{n}{p}} \rfloor n1=pn,这些数至少贡献出了 n 1 n_1 n1 个质因子 p。一般地,[1, n] 中质因子 p 的个数为

∑ k = 1 ∞ ⌊ n p k ⌋ \sum_{k=1}^{\infty}{\lfloor \frac{n}{p^k} \rfloor} k=1pkn

上式表明,n 不变,p 越大,质因子的个数越小,因此 [1, n] 中质因子 5 的个数不会大于质因子 2 的个数。证毕。

优化

[1, n] 中质因子 5 的个数为:

∑ k = 1 ∞ ⌊ n 5 k ⌋ \sum_{k=1}^{\infty}{\lfloor \frac{n}{5^k} \rfloor} k=15kn

因此我们可以通过不断将 n 除以 5,并将结果累加即得到答案。

代码 2

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

复杂度分析

时间复杂度: O ( n ) O(n) O(n)。优化后的时间复杂度为 O ( l o g n ) O(logn) O(logn)

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安秉信息桌面监控软件为什么这么受企业的欢迎

如今&#xff0c;软件市场上的桌面监控软件的类型丰富&#xff0c;种类齐全&#xff0c;几乎每个消费者都可以在市场上找到一款适合自己需求的桌面监控软件。不过&#xff0c;在市场经济调节下&#xff0c;软件行业的竞争也变得更加激烈&#xff0c;而竞争也能让真正受欢迎的桌…

CJS的module.exports 、 exports和ESM export default和 export详解

webpackg公共源码 function __webpack_require__(moduleId) {if (__webpack_module_cache__[moduleId]) {return __webpack_module_cache__[moduleId].exports;}var module __webpack_module_cache__[moduleId] { exports: {} };__webpack_modules__[moduleId](module, modu…

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence&#xff0c;AI)&#xff0c;是新一轮科技革命和产业变革的重要驱动力量&#xff0c; [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

【Ansible自动化运维】Ansible入门基础信息【安装配置、常用命令与模块】

介绍安装配置注意事项yum安装验证安装配置host配置主机清单配置主控端被控端 常用模块命令组成command模块shell模块copy模块script模块 日志信息最后 介绍 Ansible 是一个开源 IT 自动化引擎&#xff0c;可自动执行供应、配置管理、应用程序部署、编排和许多其他 IT 流程。它可…

Python 选择用类或方法做装饰器的场景

在Python中,我们可以使用方法或者类来实现装饰器。选择使用方法还是类作为装饰器,主要取决于具体的应用场景。 使用方法作为装饰器 当装饰器的功能相对简单,不需要保持任何状态信息时,使用方法作为装饰器是一个不错的选择。这种情况下,装饰器通常只是对被装饰函数进行一些额外…

YesPMP平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦&#xff0c;活动火热开启&#xff0c;现金奖励等你来领&#xff0c;最高可领千元&#xff0c;赶快参与将奖励收入囊中&#xff0c;一起来了解活动细节吧&#xff01; 一、活动内容&#xff1a; 活动一&#xff1a;【项目征集令】活动&#xff0c;…

两个变量交换值

a a ^ b ; b a ^ b ; a a ^ b ; 这段代码是一个常见的技巧&#xff0c;用于交换两个整数变量a和b的值&#xff0c;而不使用临时变量。这里使用了异或运算符&#xff08;^&#xff09;&#xff0c;它会对两个整数的每一位执行异或操作。异或操作的定义是&#xff1a;相同为0&…

前端大文件上传 -- 上传文件到S3或本地服务器

特别提醒 大文件上传的文件切片逻辑, 包括如何将分片文件上传到本地服务器, 请查看之前的文章: 前端大文件上传 - 总结&#xff08;Vue3 hook Web Worker实现&#xff0c;通过多个Worker线程大大提高Hash计算的速度&#xff09;, 本篇仅实现如何将大文件分块上传到S3. 后面写…

代码随想录打卡—day27—【回溯】— 回溯基础练习 4.15

1 39. 组合总和 39. 组合总和 我的AC代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<int> path;void dfs(int sum,vector<int>& candidates,int target,int start_idx){if(sum > target)return;if(sum target){a…

关于Wordpress的操作问题1:如何点击菜单跳转新窗口

1.如果打开&#xff0c;外观-菜单-菜单结构内&#xff0c;没有打开新窗口属性&#xff0c;如图&#xff1a; 2.在页面的最上部&#xff0c;点开【显示选项】&#xff0c;没有这一步&#xff0c;不会出现新跳转窗口属性 3.回到菜单结构部分&#xff0c;就出现了

2024年工程师职称水平能力测试考试难吗?

大家现在都知道&#xff0c;现在湖北中级和高级职称评审&#xff0c;都必须要先报名一个水平能力测试考试&#xff0c;水测考过了之后才能参加评审&#xff0c;那么很多人都不知道水测到底难不难&#xff1f;能不能考过&#xff1f;水测主要是考什么呢&#xff1f; 职称水平能力…

20240415金融读报:市场信贷不能过于宽松声音碳领域新增文件

1、市场普遍认为&#xff0c;在经济转型背景下&#xff0c;当前的社会融资规模和信贷增长有助于经济高质量发展&#xff0c;过于宽松并不利于经济发展。&#xff08;已经有这个声音了&#xff0c;是不是说明我们已经脱离了U型曲线的最低点&#xff0c;在或快接近其后半段的1/2处…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登&#xff1a;“一切非 Rust 项目均为非法”&#x1f60e; 什么是 GUI 图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口&#xff09;是指采用图形方式显示的计算机操作用户界面。 现在的应用开发&#xff0c;是既要功…

【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Linux系统编程】第三弹---基本指令(一)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、touch指令 2、mkdir指令 3、ls 指令 4、pwd命令 3、cd 指令 6、rmdir指令 && rm 指令 7、man指令 7、cp指令 …

在 PyCharm 中使用系统安装的 Python 和 Anaconda 的 Python什么区别

virtualenv environment &#xff1a; virtualenv 是一个用于创建独立 Python 环境的工具。它可以在同一个系统上创建多个相互独立的 Python 环境&#xff0c;每个环境都有自己的 Python 解释器和包库&#xff0c;从而可以实现不同项目之间的依赖隔离和版本控制。coda environm…

[已解决]问题:root.users.hdfs is not a leaf queue

问题&#xff1a;root.users.hdfs is not a leaf queue CDH集群报错&#xff1a; Exception in thread “main” org.apache.hadoop.yarn.exceptions.YarnException: Failed to submit application_1713149630679_0005 to YARN : root.users.hdfs is not a leaf queue 思路 …

海外媒体如何发布软文通稿

大舍传媒-带您了解海外发布新潮流 随着全球化的不断深入&#xff0c;越来越多的中国企业开始关注海外市场。为了在国际舞台上树立品牌形象&#xff0c;企业纷纷寻求与海外媒体合作&#xff0c;通过发布软文通稿的方式&#xff0c;传递正面信息&#xff0c;提升品牌知名度。作为…

【攻防世界】ics-07

<?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) && $_GET[page] ! index.php) {include(flag.php); }else {header(Location: ?pageflag.php); } <?phpif ($_SESSION[admin]) {$con $_POST[con];$…

Redis: 集群

文章目录 一、单点Redis的问题二、主从架构1、概述2、集群结构3、主从数据同步原理&#xff08;1&#xff09;全量同步&#xff08;2&#xff09;增量同步 4、总结&#xff08;1&#xff09;全量同步和增量同步的区别&#xff08;2&#xff09;什么时候执行全量同步&#xff08…