《程序员面试金典(第6版)》面试题 16.05. 阶乘尾数

news2024/12/27 17:41:57

题目描述

设计一个算法,算出 n 阶乘有多少个尾随零。

示例 1:

  • 输入: 3
  • 输出: 0
  • 解释: 3! = 6, 尾数中没有零。

示例 2:

  • 输入: 5
  • 输出: 1
  • 解释: 5! = 120, 尾数中有 1 个零

说明: 你算法的时间复杂度应为 O(log n) 。

解题思路与代码

这道题,乍一看很简单,实则还是考到了点其他的数学知识的。

比如:

  • 阶乘的计算:题目要求计算 n!,也就是 n 阶乘。n 阶乘表示从 1 到 n 的所有整数的乘积,即 n! = 1 × 2 × 3 × … × n。

  • 数学知识 - 因子:这道题的关键是理解尾随零是由因子 2 和 5 相乘得到的。在 n! 的因式分解中,我们需要找到因子 2 和 5 的数量。

  • 优化算法:题目要求算法的时间复杂度为 O(log n),这意味着我们需要找到一种有效的方法来计算 n! 中因子 5 的个数。在这个过程中,我们发现因子 2 的个数总是多于因子 5 的个数,因此我们只需计算 n! 中有多少个因子 5。通过不断地将 n 除以 5,我们可以找到所有的因子 5,从而有效地降低时间复杂度。

  • 避免整数溢出:原始代码试图计算 n! 的值,但这在 n 较大时可能导致整数溢出。优化后的代码通过计算因子 5 的个数来避免了这个问题,因为我们不需要实际计算 n! 的值。

具体代码如下:

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

复杂度分析

时间复杂度:O(logn)
空间复杂度:O(1)
在这里插入图片描述

总结

这道题考到了数论,因子计数的数学概念,如果你不了解这些数学概念,这道题还真不是一道简单的题。

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

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

相关文章

大数据之Hadoop分布式计算框架MapReduce

这里写目录标题 一、MapReduce概述二、MapReduce编程模型简述三、MapReduce词频统计案例mvn clean package 四、词频统计案例进阶之Combiner五、词频统计案例进阶之Partitioner六、案例二介绍 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处…

p69 内网安全-域横向 CobaltStrikeSPNRDP

数据来源 SPN(Secret Private Network缩写)_百度百科 (baidu.com) 演示案例 域横向移动RDP传递-Mimikatz域横向移动SPN服务-探针,请求,导出,破解,重写域横向移动测试流程一把梭哈-CobaltStrike初体验 案例…

python+nodejs+php+springboot+vue 企业员工健康体检预约管理系统

目 录 1 引言 1 1.1 研究的目的及意义 2 1.2 研究的主要内容 2 1.3 本文的组织结构 2 2 平台开发相关技术 3 2.1python技术的简介 3 2.2 django框架 4 2.3 MYSQL数据库 4 2.4 MySQL环境配置 5 2.5 B/S架构 5 3 软件系统需求及可行性分析 …

SpringCould+vue3项目的后台用户管理的CURD【VegePig教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【VegePig教育平台】1.1 背景 二.用户列表(分页查询)2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除3.1 前端Vue3 (Vue3-Element-…

斐波那契数列、卡特兰数

一、斐波那契数列(兔子序列) 1, 1, 2, 3, 5, 8, 13, 21, ... 递推公式:f(1)f(2)1; f(n)f(n-1)f(n-2) (n>3) 快速求f(n):矩阵快速幂(logn) 二、卡特兰数 1, 2, 5, 14, 42, 132, 429, 1430, 4862, ...…

selenium自动化环境搭建(Windows)

一、selenium介绍 selenium主要用于web应用程序的自动化测试,还支持所有基于web的管理任务自动化。 selenium经历了2个版本,selenium1.0和selenium2.0;selenium不是一个单独的工具,而是由一些插件、类库构成,每个组成…

__pycache__文件夹是什么,是缓存文件吗,可以删除吗

1.什么是__pycache__文件 用python编写好一个工程,在第一次运行后,总会发现工程根目录下生成了一个__pycache__文件夹,里面是和py文件同名的各种*.pyc或者*.pyo文件。名字上看应该是相应的缓存文件。 那为什么会出现__pycache__文件&#x…

go chan基本使用

1、有缓冲的chan 与无缓冲的chan 怎么理解这个缓冲,我个人的理解是是执行这个chan 操作的时候是否发送阻塞。 操作:读和写。 读取的时候,我们都应该要是阻塞的,例如我们的socket、的recv函数。当然取决于你设置的是阻塞的套接字还…

在安装docker配置端口时 centos7 防火墙规则失效

一、问题 1、做端口映射管理的时候,自己关闭了防火墙,或者开启防火墙,或者指定开关端口,但是都不影响端口的使用,这就很奇怪,也就是本文的内容! 2、思路,确认是请求到了防火墙的那…

MySQL: 自动添加约束、更改(删除)表名和字段、删除表

目录 自动添加表的属性: 向表内插入数据: 查看表中的数据: 查看表结构: 查看表的详细结构: 更改表名和字段: 更改表名: 更改字段数据类型: 修改字段名: 添加字段…

约瑟夫环+考勤刷卡(蓝桥杯JAVA解法)

约瑟夫环:用户登录 题目描述 设有 n 个人围坐在圆桌周围,现从某个位置 k 上的人开始报数,报数到 m 的人就站出来。下一个人,即原来的第 m1 个位置上的人,又从 1 开始报数,再报数到 m 的人站出来。依次重复…

上传ipa到appstore详细步骤

使用hbuilderx或apicloud云打包后,会生成一个ipa文件,而iphone是无法直接安装这个ipa文件的,需要将这个ipa文件上架,才能安装使用。那么如何上架呢? hbuilderx和apicloud并没有上架的教程,而苹果官方是推荐…

基于Jenkins,docker实现自动化部署(持续交互)【转】

前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致。基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的…

在 Apple 设备(包括 iPad、iOS 和 MacBook)上为用户提供完整的 SAP GUI

苹果应用功能 高效且直观的用户界面。 访问 VA01、MI31、MI04、IW21 等。– 无编程 自动化和简化您的 SAP 流程,如库存盘点 在 Apple 设备(包括 iPad、iOS 和 MacBook)上为用户提供完整的 SAP GUI,利用他们已经了解的 UI 丰富性并…

持续集成——web自动化测试集成实战

文章目录 一、Web自动化测试持续集成的好处二、环境准备三、Jenkins节点挂载四、节点环境的配置1、JDK2、Chrome 浏览器3、chromedriver4、Python3环境5、allure-commandline工具6、allure插件 五、本地运行待测代码(保证代码没有问题)六、库文件的导出七、Jenkins上运行代码配…

高功率激光切割中不良现象的排除技巧

高功率切割市场现状 随着激光行业的发展和下游产业需求的变化,高功率的激光切割设备已逐渐成为市场关注的热点。高功率激光切割凭着速度和厚度上无可比拟的优势,目前已获得了市场的广泛认可。 但由于高功率激光切割技术尚处于普及的初级阶段,…

栈溢出的原理

目录 缓冲区 我们先以解决这个题目为准 然后通过这个题目去做透 gdb 代码段 栈中 当前时刻寄存器存储的内容 1 寻找漏洞函数 输入 输出 字符串 2 确定填充长度 覆盖函数返回地址 覆盖栈上变量的内容 覆盖bss段 栈溢出是在堆栈中 对某一个变量无限制的输入 超出了…

【三十天精通Vue 3】第十九天 Vue 3的渐进式Web应用程序详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、什么是渐进式 Web 应用程序1.1 渐进式 Web 应用程序的定义…

市场预测美联储加息的有效性几何

美联储加息已狂飙一年,很多相关预测美联储加息降息的文章都会提到“一年内加息多少次的概率是多少多少”这种表述,那么这个数据是怎样计算的?本期笔者将简单讨论美国联邦利率的运作机制,介绍用于预测联储加/降息概率的方式&#x…

vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode

通过使用 qrcode 生成二维码, 使用 jszip 打包批量二维码文件, 使用 file-saver 下载打包好的zip文件, 使用 vue-print-nb 打印生成的二维码 生成二维码: 打印二维码 下载二维码 1. 批量生成二维码—安装依赖 ![请添加图片描述]…