Alkesh

LeetCode - Factorial Trailing Zeroes

Problem statement

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

Note that n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1.

Problem statement taken from: https://leetcode.com/problems/factorial-trailing-zeroes

Example 1:

Input: n = 3
Output: 0
Explanation: 3! = 6, no trailing zero.

Example 2:

Input: n = 5
Output: 1
Explanation: 5! = 120, one trailing zero.

Example 3:

Input: n = 0
Output: 0

Constraints:

- 0 <= n <= 10^4

Explanation

A simple approach is to calculate the factorial of the number first and then count the number of trailing zeroes. The above method can cause overflow for bigger numbers.

The idea is to consider prime factors of a factorial n. A trailing zero is a result of prime factor 2 and 5. We just need to count the number of 2's and 5's.

Consider the example n = 5. There is one 5 and three 2s in prime factors of 5!.

5! = 5 * 4 * 3 * 2 * 1
   = 5 * 2^2 * 3 * 2
   = 2^3 * 3 * 5

And for n = 11, we have two 5s and eight 2s.

11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
    = 2^8 * 3^4 * 5^2 * 7 * 11

We can easily say that number of 2s is greater than number of 5s. We only need to count the number of 5s in prime factors and we are done.

Count number of 5s in prime factors of n!

The simplest way is to calculate floor(n/5). For example 7! has one 5, 10! has two 5s. But for the case where n is 25, 125, etc we have more than one 5. When we consider 29! we get one extra 5 and the numbers of trailing zeroes becomes 6. To handle this case, we first divide n by 5 and remove all single 5s, then divide by 25 to remove extra 5s and so on.

Trailing 0s in n! = floor(n/5) + floor(n/25) + floor(n/125) + ....

C++ solution

class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;

        for(long int i = 5; n / i >= 1; i *= 5){
            count += n/i;
        }

        return count;
    }
};

Golang solution

func trailingZeroes(n int) int {
    count := 0

    for i := 5; n / i >= 1; i *= 5 {
        count += n/i
    }

    return count
}

Javascript solution

var trailingZeroes = function(n) {
    let count = 0;

    for( let i = 5; n / i >= 1; i *= 5 ) {
        count += Math.floor(n / i);
    }

    return count;
};

Dry Run

Let's dry-run our algorithm to see how the solution works.

Input: n = 29

Step 1: count = 0

Step 2: loop for i = 5; n / i >= 1
        28 / 5 >= 1
        5 >= 1
        true

        count = count + n / i
              = 0 + 29 / 5
              = 0 + 5
              = 5

        i *= 5
        i = 5 * 5
          = 25

Step 3: n / i >= 1
        28 / 25 >= 1
        1 >= 1
        true

        count = count + n / i
              = 5 + 29 / 25
              = 5 + 1
              = 6

        i *= 5
           = 25 * 5
           = 125

Step 4: n / i >= 1
        28 / 125 >= 1
        0 >= 1
        false

Step 5: return count

So we return the answer as 6.
Share this post!