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

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

说明: 你算法的时间复杂度应为 O(log n) 。
思路分析:不难发现,只用出现2的倍数、5的倍数相乘才会在末尾出现零。并且2的倍数出现的次数肯定多余5的倍数出现的次数。所以这道题就转换为1~n中,5出现的次数(需要注意5的次方)。
方法一:计算5出现的次数,被5整除的数计算1次,被25整除的数计算2次,被125整除的数计算3次…
但是在计算被5整除的数时被25整除的数(5t)已经被计算了一次,所以再计算被25整除的数只要计算一次。
在计算被5、25整除的数中,被125整除的数各被计算了一次,所以再计算被125整除的数中只要计算一次。

class Solution {
public:
    int trailingZeroes(int n) {
        return n / 5 + n / 25 + n / 125 + n / 625 + n / 3125 + n / 15625 + n / 78125 + n / 390625 + n / 1953125 + n / 9765625 + n / 48828125 + n / 244140625 + n / 1220703125;
    }
};

LeetCode 阶乘后的零

方法二:将上面的方法转化为递推。

class Solution {
public:
    int trailingZeroes(int n) {
        int ans=0;
        while(n>0)
        {
            n=n/5;//随着迭代的推进相当于n的起始值分别除5,25,125...
            ans=ans+n;
        }
        return ans;
    }
};

LeetCode 阶乘后的零

相关文章:

  • 2021-08-31
  • 2021-09-23
  • 2021-04-24
  • 2022-12-23
  • 2021-11-01
  • 2022-12-23
  • 2021-05-16
  • 2022-12-23
猜你喜欢
  • 2022-02-08
  • 2022-01-03
  • 2022-12-23
  • 2022-12-23
  • 2021-08-18
  • 2021-12-26
  • 2022-12-23
相关资源
相似解决方案