首页 > 其他分享 >172.阶乘后的零

172.阶乘后的零

时间:2024-04-06 19:33:40浏览次数:16  
标签:int 代码 除以 个数 因子 ans 阶乘 172

题目:

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例 1:

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

示例 2:

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0

示例 3:

输入:n = 0
输出:0

思路: 

末尾零的个数实际上是由阶乘中因子5的个数决定的,因为每个2和5相乘会产生一个10,从而贡献一个末尾的零,而因子2的个数通常比因子5的个数多,所以只需计算因子5的个数即可。

 实现代码:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        ans = 0
        for i in range(5, n + 1, 5):
            while i % 5 == 0:
                i //= 5
                ans += 1
        return ans

对代码的详细解释:

        前两行定义了一个名为Solution的类和一个名为trailingZeroes的方法,该方法接受一个整  数n作为参数,并返回一个整数。第3行初始化了一个变量ans,来存储最终结果,即末尾零的个数。第4行开始一个循环,从5开始,到n结束(包含n),每次增加5。这样做是为了检查从5开始,所有5的倍数对末尾零的贡献。第5行开始一个内部循环,只要i能够被5整除,循环就会继续。第6行将i除以5,并赋值回i。第7行将ans增加1,因为每次i除以5,就意味着找到一个额外的因子5。第8行返回变量ans的值,即末尾零的总数。但是,这段代码实际上效率并不高,因为对于每个5的倍数,它都要进行多次循环和除法操作。

这里还有一个更高效的思路: 
      直接计算n中包含多少个5的因子,这可以通过不断将n除以5并累加结果来实现。
实现代码:
class Solution:
    def trailingZeroes(self, n: int) -> int:
        ans = 0
        while n>0:
            n //= 5
            ans += n
        return ans

对代码的详细讲解:

       前3行与上个方法一致,这里就不多啰嗦了。第四行这是一个while循环的条件,只要n大于0,循环就会继续执行。当n减少到0时,意味着已经计算完所有可能的因子5,循环结束。第5行代码将n除以5,并且使用整除//操作来确保结果是整数。例如,如果n是25,那么n //= 5后,n的值会变成5。这行代码实际上是在计算n中包含多少个5的因子,因为每次除以5,就相当于去掉一个5的因子。第6行代码将n的值加到变量ans上。由于n是上一步中除以5的结果,这个操作实际上是在累加所有5的因子。例如,如果n是25,那么在n //= 5之后,n变成5,然后这个5会被加到ans上。这样,ans就会逐渐增加,直到计算完所有5的因子。

总结:

在这一题里,我了解到了/、//和%在python中的区别,/是正常除,平常除法是什么结果就是什么结果;//是除完之后取整;%是除完之后取余 。

 以上是我对这一题的一些想法,如果大家觉得我的想法与思考还不错的话,留下一个小小的赞再走啵!!!

标签:int,代码,除以,个数,因子,ans,阶乘,172
From: https://blog.csdn.net/m0_75184481/article/details/137433512

相关文章

  • 编写一个算法来计算 n 阶乘中尾随零的数量
    算法:编写一个算法来计算n阶乘中尾随零的数量解题思路:当n过大时,从1遍历至n,那么会超时,发现以下规律:n!=1*2*3*4*(1*5)*...*(2*5)*...*(3*5)...每隔5个数就会出现一个5,因此我们只需要通过n/5来计算存在存在多少个5个数,那么就对应的存在多少个......
  • 阶乘(C++实现)
    阶乘是基斯顿·卡曼(ChristianKramp,1760~1826)于1808年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。公式表示为:0!=1n!= ()阶乘运算在C++语言中的实现,代......
  • 中国 10 亿参数规模以上大模型数量已超 100 个;GitHub 推出代码自动修复工具丨 RTE 开
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢......
  • PTA基础编程题目集 6-10 阶乘计算升级版
    阶乘计算升级版本题要求实现一个打印非负整数阶乘的函数。函数接口定义:voidPrint_Factorial(constintN);其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalidinput”。裁判测试程序样例:#include<stdio.h>......
  • 172基于springboot的二手车交易系统的设计与实现
    ......
  • [ARC172A] Chocolate
    原题链接题解考虑以下决策,绝对最优:1.按巧克力块的大小排序,先把大的块分出来。2.一开始完整的巧克力是块矩形,取出一个正方形后,可以分为下方和右侧两个矩形,然后把这两个矩形放入优先队列。3.分割下一个矩形时,从队列中取出最短边最长的那个矩形,在这个矩形上做步骤2一样的分割......
  • EECS 1720简单线程探索
    LAB6::探索和使用鼠标事件、键事件和简单线程(计时器)先决条件-实验室1-5实验室资源:JavaAPI:https://docs.oracle.com/javase/8/docs/api/JavaSwing:https://docs.oracle.com/javase/tutorial/uiswing/components/index.html**事件/事件处理程序接口的Swing层次结构提醒。步骤1:......
  • OJ :1089 : 阶乘的最高位
    题目描述输入一个正整数n。输出n!的最高位上的数字。输入输入一个正整数n(n不超过1000)。输出输出n!的最高位上的数字。样例输入 1000样例输出 4思路:     这个问题的难点就在于如何处理据,需要注意数据溢出,比如1000的阶乘就很大很大,就算longlongint都存......
  • 做题小计 arc172e
    传送门*2300牛逼打表题。这个式子很不可思议,让人无从下手。选择打表找规律。由于\(2\nmidX\)和\(5\nmidx\)这些数我们可以跳过通过打表前\(10000\)的数,我们发现似乎没有重复的。继续打表\(1000000\)也没有重复的。直接大胆猜想,\(10^9\)内的\(n^n\)是构成无冲......
  • abc172D 约数之和
    题面:记f(x)表示x的约数个数,例如,12的约数有1,2,3,4,6,12共6个,因此f(12)=6。给定n,求\(\sum_{k=1}^{n}k*f(k)\)。范围:n<=1E7思路:用类似素数筛的做法预处理出所有f,然后遍历一次得到答案,时间复杂度O(nloglogn)。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglon......