求一个数阶乘末尾有几个零

2023-11-13

昨天校赛有一道题,是求一个数的阶乘,末尾有几个零。当时是没有做出来的。今天网上看了下,明白了原理。其实很多人都写过了,自己之所以再写,一是为了加强自己的理解,二是有的地方或许可以写得更详细,也写出自己思考的一些误区。
回到题目本身,求一个数的阶乘,末尾有几个零
最容易想到的就是,(设这个数为n),求出n!,然后找出末尾有几个零。但,一旦n的值大了,就会溢出


这里有一个更简单的解决办法。
求末尾几个零,最小的末尾带零的数就是10了。

10=2*5

每一对2,5就会产生一个0
现在我们的问题就从求n!末尾有几个零,转为,n!有多少对2,5。
我们可以进一步将问题简化为,求n!拆分成的因子中有多少个5。为什么是5,不是2,是因为2出现的频率比5高。举个例子,200=2*5*2*5*2
给出计算公式

SUM=N/5+N/5/5+N/5/5/5+...[直到N为0截止]   公式1
N/5       指可以被5整除
N/5/5     指可以被25整除
N/5/5/5   指可以被125整除
SUM       指末尾0的个数

式子比较抽象,我们带入具体的值来理解下。

N=20,SUM=20/5=4,即末尾有4个0
不难理解,20!= 20*19*18*17*....*3*2*1
20,15,10,5 分别提供了一个5

有的同学可能看到这儿可能会这样想,每十个数,就有一对形如*5,*0的数,
那我们就可以得出这样一个公式

SUM=N/5            公式2
N=20,SUM=20/5=4

咋看起来是对,但这个是不全面了。
因为这个式子只考虑了被5整除的情况,没有考虑被5^2,5^3,5^4…整除的情况

为了方便理解,我们这儿同样取一个特殊的值,带入上述的两个公式来进行说明

N=25
带入公式1   SUM=N/5+N/5/5+N/5/5/5+...[直到N为0截止]
SUM=25/5+25/5/5=6
带入公式2   SUM=N/10*2
SUM=25/5=5

25!=25*24*23*...*3*2*1
取出形如*5,*0的数:25 20 15 10 5,共5个数 
咦,5个数只会在末尾提供5个0呀
真的如此吗
        25*24=600,这儿提供了两个0.
    5*5*2*2*6=600

25是可以拆分成两个5相乘的,125是可以拆分成3个5相乘的,依次类推...

现在再回过头来看公式1

SUM=N/5+N/5/5+N/5/5/5+...[直到N为0截止]   公式1
N/5       指可以被5整除
N/5/5     指可以被25整除
N/5/5/5   指可以被125整除
SUM       指末尾0的个数

就容易理解公式了


这儿附上源码

#include<iostream>
using namespace std;
int main()
{
    int m;
    while(cin>>m)
    {
        int sum=0;
        while(m){
            sum+=m/5;
            m=m/5;          
        }
        cout<<sum<<endl;
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求一个数阶乘末尾有几个零 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 家里用服务器放在哪个位置,路由器摆放在家中哪个位置好 路由器摆放位置【详解】...

    路由器摆放在家中哪个位置好 路由器的摆放位置其实非常讲究的 这里就给大家讲解下相关知识 一起来看看 其实wifi所发射的信号 也就是无线电波 向手机和收音机发射出的电磁波是一样的 但是呢wifi的信号相当的短 一般常见的话只有12公分左右
  • Windows Server 系列 - User logon name(pre-Windows 2000) 和 User logon name 的区别

    一 在Active Directory中一直疑惑User logon name pre Windows 2000 和 User logon name这两个字段的区别 详细如下 AD UI界面展示名称 AD 后端属性名称 User logon
  • 使用Composition API和setup语法糖重构Vue组件

    Vue3 引入了Composition API 它是一种更灵活的方式来组织和复用组件的逻辑 而不是依赖于传统的选项式API 如data methods computed等 Composition API的核心是一个名为setup的函数 它可
  • 如何在github上重命名或修改文件夹

    在github上整理流程的时候 有一个文件夹命名不合适 想返回去改 但是在网页上没有找到重命名文件夹的选项 经过一番折腾之后 我是这么做的 1 首先在服务器上找到公匙 公匙在 ssh目录下 以 pub结尾的文件 将其复制 2 在github
  • markdown基本用法

    标题 和 都可以用于表示标题 一级标题 二级标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 标题的前后都要空一行 号后应当加一个空格 和 应当顶格书写 建议使用 来表示标题 字体 斜体 斜体 加粗 粗体 斜体 加粗 斜体
  • OpenCV中的人脸活体检测和身份认证如何实现?OpenCV人脸识别

    本文将介绍如何在OpenCV中实现人脸活体检测和身份认证 结合人脸检测 关键点定位和深度学习模型 我们可以有效地检测和区分真实人脸和照片 视频等非真实生物特征 以实现可靠的身份认证和活体检测 人脸检测和关键点定位 使用OpenCV提供的人脸
  • [STM32学习笔记(一)] 如何安装keil5 MDK版本并安装C51

    文章目录 1 注意事项 2 安装流程 2 1 获取Keil5安装包 2 2 安装keil5 2 3破解keil5 MDK 2 4 安装STM32芯片包 3 在安装了mdk的基础上安装c51 1 注意事项 安装路径必须全部是英文 如果已经安装
  • 突破前端反调试:阻止页面无限不断debugger

    不知道你们有没有遇到过上图这样 有时候想调试网站 一打开开发者工具立即 debugger 而且跳过了还是会继续 或者是有时候在调试网页时 突然就给你来一个 debugger 接着就是反复来回 debugger 了 贼烦 那今天分享个教程 教
  • Spock1

    文章目录 背景 扩展 BDD Behavior driven development行为驱动测试 依赖 Demo Spock深入 结构 setup与given assert 异常断言 Mock 创建对象 注入对象 调用频率约束 目标约束 方
  • Nacos-2.1.1安装配置+集群

    Nacos安装配置 集群 nacos 2 1 1安装配置 集群 Linux 一 环境准备 二 Nacos安装 运行 单机 三 替换nacos内置数据源 四 nacos集群配置 nacos 2 1 1安装配置 集群 Linux 本篇博客用于记
  • linux 启动盘zhi,Linux制作启动盘之dd命令详解

    1 dd命令简介 dd在linux中是 一个非常强大的工具 常用于复制大量数据 测试读写性能 清空硬盘数据 不可恢复 由于dd 命令允许以二进制方式读写 所以特别适合在原始设备上输入 输出 dd命令用于复制文件并对原文件的内容进行转换和格式
  • Windows 通过CMD窗口利用mybatis-generator连接Oracle快速生成代码

    环境说明 Windows10 JDK8 ojdbc6 11 2 0 4 jar mybatis generator core 1 3 7 jar 1 在C盘新建autoMybatis文件夹 文件夹中新建generator xml文件 并将o
  • bzoj3309 DZY Loves Math

    题目链接 bzoj3309 题目大意 对于正整数n 定义f n 为n所含质因子的最大幂指数 给定正整数a b 求 ai 1 bj 1f gcd i j sum i 1 a sum j 1 b f gcd i j T lt 10000 1 l
  • Android系统中设置TextView的行间距

    Android系统中TextView默认显示中文时会比较紧凑 不是很美观 为了让每行保持一定的行间距 可以设置属性android lineSpacingExtra或android lineSpacingMultiplier 1 设置行间距
  • Echarts中X轴label间隔显示=>interval

    项目中我们经常都会遇到大量数据 需要我们的echarts来展示 但是我们的X轴的label是长度是有限的 在大量数据的传递下必然出现label重叠 这个时候我们就要用到interval如图 通过设置xAxis中的axisLabel inte
  • OpenMP和OpenACC

    OpenMP OpenMP是CPU的并行编程模型 它使用编译器指令来识别并行区域 omp set num threads n streams 用来指定要用到的CPU线程数 类似于设置环境变量 pragma omp parrallel 标记代
  • 使用openMVS对样例数据进行重建

    openMVS根据github上的步骤进行编译 注意 如果没有GPU 用不了CUDA的话 那么需要在openMVS目录下找到CmakeLists txt文件 把CUDA设置为OFF SET OpenMVS USE CUDA OFF CACH
  • linux系统之字符设备驱动——IIC驱动mma8451q

    linux系统之字符设备驱动 IIC子系统驱动mma8451q 1 原理图 2 驱动程序 mma8451q c Author your name Date 2021 02 23 22 16 37 LastEditTime 2021 02 2
  • The POM for is missing no dependency information available

    环境 win7 64 MyEclipse 10 5 java version 1 8 0 91 报错 1 导入报错 No marketplace entries found to handle maven compiler plugin 3
  • 求一个数阶乘末尾有几个零

    昨天校赛有一道题 是求一个数的阶乘 末尾有几个零 当时是没有做出来的 今天网上看了下 明白了原理 其实很多人都写过了 自己之所以再写 一是为了加强自己的理解 二是有的地方或许可以写得更详细 也写出自己思考的一些误区 回到题目本身 求一个数的