TrailingZeros——Leetcode 0172 寻找尾零的数目

长短期记忆网络(Long Short-Term Memory networks, LSTM) 如何简单的理解LSTM——其实没有那么复杂: 阅读详情

题目描述

Given an integer n, return the number of trailing zeroes in n!.

Note that n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 3 ∗ 2 ∗ 1. n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1. n!=n∗(n−1)∗(n−2)∗...∗3∗2∗1.

Example1

Input: n = 3
Output: 0
Explanation: 3! = 6, no trailing zero.

Example2

Input: n = 5
Output: 1
Explanation: 5! = 120, one trailing zero.

Example3

Input: n = 0
Output: 0

Constraints

  • 0 < = n < = 1 0 4 0 <= n <= 10^4 0<=n<=104

题解

题目分析:题目要求求出任意给定一个正整数n的阶乘的尾零个数,例如Example2中给出的那样, 5 ! = 120 5!=120 5!=120,因此尾零个数即为1。
看到这里,相信许多同学已经跃跃欲试,那我直接求解 n ! n! n!然后把结果中尾零的个数求出来不就完事儿了?上代码:

class Solution:
    def fact(self, n):
        if n == 1:
            return n
        return n * self.fact(n - 1)

    def trailingZeroes(self, n: int) -> int:
        result = self.fact(n)
        bits = list(str(result))
        i = len(bits) - 1

        while bits[i] == '0':
            i -= 1

        return len(bits) - 1 - i

以上代码给出了本题最直接的解法,很容易便可以求出尾零的个数。可惜天不遂人愿,我们看题目给出的约束,即 n < 1 0 4 n <10^4 n<104,可以想象如果给定的 n = 10000 n=10000 n=10000那么在求解上述阶乘时就直接原地爆炸堆栈溢出,我们用的栈太多了。实际上,不需要 n = 10000 n=10000 n=10000,我们给定一个较大的 n n n时编译器会告诉我们实际上可以允许的堆栈到底有多少,上图:
在这里插入图片描述
事实上当递归次数超过图中圈画的次数时,递归将会被强制停止。。。因此以上方法虽然理论上可行,但是真正实现时其只允许数字不超过 n = 997 n=997 n=997(还好不是996…),因此我们需要重新考虑。求出尾零的个数,是不是必须要把最后的结果求出来呢?

非也

这道题从考察角度出发并不是为了让我们写上面的递归程序,而是考察我们的数学理解能力。我们知道只有在乘法中出现 10 10 10时,尾部才会增加一个 0 0 0,因此我们需要考虑的是如何运算才会出现 10 10 10,很简单,对其做质因数分解,我们知道 10 = 5 × 2 10=5\times2 10=5×2,因此对每一项做质因数分解找到其中的 2 , 5 2,5 2,5对的个数,即为尾零的数目。
针对Example2给出的例子:
5 ! = ( 5 ∗ 1 ) ∗ ( 2 ∗ 2 ) ∗ ( 3 ∗ 1 ) ∗ ( 2 ∗ 1 ) ∗ 1 5!=(5*1)*(2*2)*(3*1)*(2*1)*1 5!=(5∗1)∗(2∗2)∗(3∗1)∗(2∗1)∗1
可以发现,其中 5 , 2 5,2 5,2只出现了一对。另一个很容易发现的点是,2的数目远远多于5的个数,因此我们只需要求取 5 5 5出现的次数即可,上代码:

class Solution:
    def find_factor_five(self, n):
        # 求取n的质因数中5的个数
        counter = 0
        while n % 5 == 0:
            n /= 5
            counter += 1

        return counter

    def trailingZeroes(self, n: int) -> int:
        # 统计5的个数
        counter = 0
        if n < 5:
            return counter
        while n > 5:
            n_factor_five = self.find_factor_five(n)
            n -= 1
            counter += n_factor_five
        return counter + 1

上述代码非常清楚的阐释了上面所说的一堆废话。但是这是不是就是最佳的求解方法呢?事实上,针对题目给出的限制该方法已足够Pass所有测试用例,但是当 n n n的值取得更大时(比如一个小目标),我们会发现上述方法计算时间也是非常可观:
在这里插入图片描述
单位是 s s s!,所以上述方法是不是还有改进的余地呢?
Leetcode上的老哥@Wang给出了一个更加迅速的方法。
我们重新分析,在从 1 1 1计数到 n n n的过程中,我们会发现其实 5 5 5的出现是有规律的,其只会出现在 5 , 10 , 15 , 20 , . . . 5,10,15,20,... 5,10,15,20,...这些数字中,即每隔 5 5 5个数字会出现一次,但是值得注意的是每隔 5 2 5^2 52会出现2个 5 5 5,每隔 5 3 5^3 53会出现3个 5 5 5,不难发现,我们所要求取的 5 5 5的个数其实只需要按照上述规律计数即可,上代码:

class Solution:
    def find_factor_five(self, n):
        # 求取n的质因数中5的个数
        counter = 0
        while n % 5 == 0:
            n /= 5
            counter += 1

        return counter

    def trailingZeroes(self, n: int) -> int:
        # 统计5的个数
        counter = 0
        if n < 5:
            return counter
        while n > 5:
            n_factor_five = self.find_factor_five(n)
            n -= 1
            counter += n_factor_five
        return counter + 1
    def trailingZeroes_Count(self, n: int) -> int:
        counter = 0
        # 直接计数!
        while n / 5 > 1:
            counter += int(n / 5)
            n /= 5
        return counter


s = Solution()
start = time.time()
n = 100000000
print(s.trailingZeroes_Count(n))
end = time.time()
print(f"Time cost for value {n} is: ", end - start)

对比一下时间…
在这里插入图片描述
这可不是吹出来的兄弟萌,牛逼!

从 Chat 提示词到可运行 Fiori 应用,ADT for VS Code 正在把 RAP 开发带进 Agent 时代 本文探讨了在VS Code中使用AI辅助进行ABAP RAP开发的新模式。文章指出,传统RAP开发需要手工创建数据库表、CDS视图、行为定义等十多个关联对象,命名和关联关系容易出错。现在通过GitHub Copilot Agent Mode配合ADT MCP Server,开发者可用自然语言描述业务场景直接生成完整的RAP业务对象。这种生成式开发的核心价值在于:1)通过标准化工具接口(MCP)连接ABAP后端,确保生成符合规范的RAP对象;2)能正确处理多实体组合场景下的命名一致性和关联关系;3)保持生成结 阅读详情

相关推荐

Transformer代码(Pytorch实现和详解)!!!

这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。

xml的博客 5613

Trailing Zeroes (III)

题目大意: 找最小的n使得n!尾部的0的数量为Q。 解题思路: 末尾0的个数就是指这个数总共有几个10因子,而10又能表示成2和5的乘积。假设m=n!,那么m中2的因子个数肯定大于5的因子个数,所以m中5的因子个数即是所要求结果,显然n除以5可得到1~n中包含有一个因子5的个数,但是,1~n中有的数可以被5整除好几次,所以必须将这个数再除以5,得到1~n中包含有两个因子5的个数,依次循环...

Apollo的博客 458

IBM 3560M3 R5 坏盘更换记录

公司一台老旧 3650M3在日常巡查过程中发现硬盘报错

ddriv的博客 3944

Trailing Zeros

题目链接:Trailing Zeros 二进制当中0的数量最少,实际上就是2的因子数量最少。 所以显然按照2的因子个数从大到小排序。 然后最小的交换次数显然就是逆序数。 注意如果两个数字的因子数量相同,应该按照本身的顺序。 AC代码: #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> #define int long long using namespace std; const int N

青烟绕指柔的博客 488

低功耗和UPF介绍

参考[UPF]低功耗(Low Power Design)and UPF介紹

青春易逝,愿不负昭华,期待梦与远方 1万+

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1906

二分+质因数分解,LightOJ 1138Trailing Zeroes (III)

二分+质因数分解

EQUINOX1的博客 472

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 820

Trailing Zeros算法

Trailing Zeros算法 该算法用于计算n的阶乘中尾部所包含零的个数; 举例 示例1:当n为5时 Input : 5; Output : 1 Explanation:5! =120,120的尾部有1个0,所以输出应该为1; 示例2:当n为11时 Input : 11; Ouput : 2; Explanation : 11! = 39916800,结尾有2个0,所以输出应该为2; 实现 ...

算法学习 1661

3GPP协议解读_物理层系列(一)_物理层协议怎么看?

5G NR相关协议一般都在38系列,点进去以后可以看到,38.2xx系列为物理层相关协议,为了掌握物理层相关知识,应该怎么看协议呢?我建议从38.201读起,对38.2xx系列协议有一个整体的把握。

JCMLSY的博客 1329

1-Spring Security OAuth2专栏介绍

我自己 我是码农小胖哥,一名后端软件工程师,有多年的后端开发经验,同时也是一名热衷于技术分享、拥抱开源的技术博主。我的技术栈主要是Java、Python、Kotlin,欢迎各位同行进行交流和分享。 个人技术公众号:码农小胖哥 个人博客:https://felord.cn Gitee: https://gitee.com/felord 你可以通过以上方式和我交流、解决学习中的疑难杂症。 2021年开源Spring Security 干货系列教程,2022年又开源Spring Security进阶版,帮

码农小胖哥 7937

算法学习笔记--6.trailing-zeros

设计一个算法,计算出n阶乘中尾部零的个数

丰伟磊的博客 1121

FCTA/FCTB 前方交通穿行预警/制动系统技术规范

FCTA&FCTB前方交叉路口预警制动系统是针对十字路口和停车场等"鬼探头"场景设计的驾驶辅助系统。系统在自车速度0-40km/h范围内工作,通过角雷达和摄像头检测侧向来车.

未知艺术家的博客 743

Trailing Zeroes (III) (尾随零的个数) LightOJ - 1138

You task is to find minimal natural numberN, so thatN!contains exactlyQzeroes on the trail in decimal notation. As you knowN! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the tr...

weixin_45177251的博客 198

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法 Trailing Zeros

计算出n阶乘中尾部零的个数 样例 1: 输入: 11 输出: 2 样例解释: 11! = 39916800, 结尾的0有2个。 样例 2: 输入: 5 输出: 1 样例解释: 5! = 120, 结尾的0有1个。 分析:尾数的个数是根据素因子分解 则存在 2*5产生尾数0 所以可以确定出5的个数即为0...

左右为南的专栏 642

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

N的阶乘(N!)中的末尾有多少个0?(Trailing Zeros)

题目 N的阶乘(N!)中的末尾有多少个0? 描述 Input: 11 Output: 2 Explanation: 11! = 39916800, so the output should be 2 Input: 5 Output: 1 Explanation: 5! = 120, so the output should be 1. 链接 https:/...

qq_20064763的博客 1377

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Trailing Zeroes(1)

We know what a base of a number is and what the properties are. For example, we use decimal number system, where the base is 10 and we use the symbols - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. But in different bases we use different symbols. For example in binary

weixin_46250672的博客 245

Trailing Zeroes (III) LightOJ - 1138

思路:二分统计5的个数 #include <bits/stdc++.h> #define int long long using namespace std; const int32_t N = 1e7 + 10; int t, n; int f5(int x) { //统计当前数中5的个数 int ans = 0; while(x) { ans +...

Endeavor_G的博客 252

Trailing Zeroes (I)(分解质分子求约数个数)

const int N = 1e5 + 5,M=1e6+5; int t; ll p[N], cnt; bool vis[M]; void x_x() { f(i, 2, M) { if (!vis[i])p[++cnt] = i; for (int j = 1;p[j] <= M / i;j++) { vis[p[j] * i] = true; if (i%p[j] == 0)break; } } } int main() { //freopen("in.txt"

qq_43543086的博客 220

Trailing Zeroes (III)------二分搜索+阶乘分解

You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the tra...

CYBCLOUD的博客 295

AD09 Altium designer 09 生产文件—— 输出光绘文件和(Gerber Files )(NC Dirll Drawings)(小白专用)(超级详细三大步)打样输出-无敌版

Gerber 文件是一种标准的 PCB 制造数据格式,包含了设计电路板所需的所有图层和信息。通过这些文件,PCB 制造商能够将电子设计转化为实际的电路板。这些设置项允许用户精细控制Gerber文件的生成,确保PCB设计可以被准确地转化为制造数据。通过调整这些参数,设计者可以优化文件大小、提高生产精度,并为制造商提供必要的指令和检查标准。5小步完成之后,会生成一个CAMtastic1.cam和一个CAMtastic1 Document文件。

qq_58662017的博客 6771

[LintCode] Trailing Zeroes 末尾零的个数

Write an algorithm which computes the number of trailing zeros in n factorial. Have you met this question in a real interview? Yes Example 11! = 39916800, so the out s...

weixin_34301307的博客 169

trailing zeroes

You task is to find minimal natural numberN, so thatN!contains exactlyQzeroes on the trail in decimal notation. As you knowN! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the tra...

qq_42865713的博客 280

LeetCode Factorial Trailing Zeroes数学方法详解

Given an integer n, return the number of trailing zeroes in n!.题目的意思是要求一个整数的阶乘末尾有多少个0;1.需要注意的是后缀0是由2,5相乘得来,因此只需看有多少个2,5即可 n = 5: 5!的质因子中 (2 * 2 * 2 * 3 * 5)包含一个5和三个2。因而后缀0的个数是1。 n = 11: 11!的质因子中(2^8

yqtao的博客 4443

【数论】Trailing Zeroes (III)

Trailing Zeroes (III)????点击打开题目 You task is to find minimal natural numberN, so thatN!contains exactlyQzeroes on the trail in decimal notation. As you knowN! = 1*2*...*N. For example, 5! = 120, 12...

1207

172. Factorial Trailing Zeroes [easy] (Python)

题目链接https://leetcode.com/problems/factorial-trailing-zeroes/题目原文 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 题目翻

Coder_Orz的博客 3609
上一篇: 3Sums——Leetcode 0015三数之和_枚举类方法
下一篇: Leetcode 386. Lexicographical Numbers
CAAT9
博客等级 码龄10年 21粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值