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 @ 2022-03-26 16:47  ˙鲨鱼辣椒ゝ  阅读(31)  评论(0)    收藏  举报