172. 阶乘后的零

题目描述:

  给定一个整数 n ,返回 n! 结果中尾随零的数量。提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

 

解题思路:

  首先排除将阶乘算出来后再统计尾随零个数的方法,毕竟阶乘的结果很容易就溢出了。实际上,我们从1开始遍历到n,每多乘一个10,尾随零个数就加1,这个“10”哪里来的呢?“10”可以从每个相乘的数中提取出因子2和5来组合而成。以10!为例,10!= 10*9*8*...*2*1 = (2*5)*9*(2*4)*7*(2*3)*(1*5)*(2*2)*3*2*1,可以发现因子2的个数总是比5多,因此要想找有多少个“10”,只需要找“5”的个数即可。在这里,10!中因子“5”只能在数字5和数字10中提取出来,一共2个因子“5”,故尾随零个数为2个。

  可以理解为,每5个数中必然有1个因子“5”。但是,例如数字25、50或125等,它们能提取出来的因子“5”不止一个,25=5*5,50=5*5*2,125=5*5*5。那么可以认为,每25个数中必然多出来一个因子“5”,每125个数中必然再多出来一个因子“5”,因此类推。

  因此,整数n的阶乘有n个数依次相乘,那么可以去统计每5个数组成一组,每25个数组成一组,每125个数组成一组,每625个数组成一组,分别可以有多少组。例如,n=100,每5个数成组可以有20组,那么就有20个因子“5”,每25个数成组可以有4组,那么就有4*2=8个因子“5”,但要注意,前面每5个一组统计的时候包括了数字25、50、75、100中因子“5”的个数,因此在每25个数一组统计的时候只需要加上额外增加的因子“5”的个数即可(额外增加了4个),因此n=100的时候尾随零应该是20+4个。

代码如下:

复制代码
var trailingZeroes = function(n) {
    let ans = 0;
    while(n>0){
        let group = Math.floor(n/5); 
        ans += group;
        n = n/5; 
    }
    return ans;
};
复制代码

 

posted @   ˙鲨鱼辣椒ゝ  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示