【LeetCode从零单刷】Factorial Trailing Zeroes

题目:

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

Note: Your solution should be in logarithmic time complexity.

解答:

n 的阶乘末尾有多少个 0?其实也就是询问结果是10的多少倍数。10 = 2 * 5,因此对每个乘数进行因式分解就好。

因此,我最开始的做法是遍历每个数,它是2的多少倍,5的多少倍,分别求和,取 sum2 和 sum5 的更小值。答案是对的,不过超时了。

能不能不遍历每个数来计算呢?

首先,我们需要确定一件事:分解的因式中,2的个数肯定远远多于5。因此 10 的倍数取决于 5 的因式个数。想一想:

  1. 1~n 个数中,每隔5个数,会产生一个5,这会产生 (n/5) 个5;
  2. 每隔25个数,会多产生一个5,这会产生 (n/25) 个5;
  3. 每隔125个数,又多产生一个5,这会产生 (n/125) 个5;
  4. ……

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        while(n > 1) {
            ans += n/5;
            n = n/5;
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode,C++)