Skip to content Skip to sidebar Skip to footer

Finding Natural Numbers Having N Trailing Zeroes In Factorial

I need help with the following problem. Given an integer m, I need to find the number of positive integers n and the integers, such that the factorial of n ends with exactly m ze

Solution 1:

To get number of trailing zeroes of n!efficiently you can put

defzeroes(value):
    result = 0;

    d = 5;

    while (d <= value): 
        result += value // d; # integer division
        d *= 5;

    return result; 

...

# 305: 1234! has exactly 305 trailing zeroes print zeroes(1234) 

In order to solve the problem (what numbers have n trailing zeroes in n!) you can use these facts:

  • number of zeroes is a monotonous function: f(x + a) >= f(x) if a >= 0.
  • if f(x) = y then x <= y * 5 (we count only 5 factors).
  • if f(x) = y then x >= y * 4 (let me leave this for you to prove)

Then implement binary search (on monotonous function).

E.g. in case of 250 zeroes we have the initial range to test [4*250..5*250] == [1000..1250]. Binary search narrows the range down into [1005..1009].

1005, 1006, 1007, 1008, 1009 are all numbers such that they have exactly 250 trainling zeroes in factorial

Edit I hope I don't spoil the fun if I (after 2 years) prove the last conjecture (see comments below):

Each 5**n within facrtorial when multiplied by 2**n produces 10**n and thus n zeroes; that's why f(x) is

f(x) = [x / 5] + [x / 25] + [x / 125] + ... + [x / 5**n] + ...

where [...] stands for floor or integer part (e.g. [3.1415926] == 3). Let's perform easy manipulations:

f(x) = [x / 5] + [x / 25] + [x / 125] + ... + [x / 5**n] + ... <= # removing [...]
        x / 5  +  x / 25  +  x / 125  + ... +  x / 5**n  + ... =
        x * (1/5 + 1/25 + 1/125 + ... + 1/5**n + ...) =
        x * (1/5 * 1/(1 - 1/5)) =
        x * 1/5 * 5/4 =
        x / 4

So far so good

 f(x) <= x / 4 

Or if y = f(x) then x >= 4 * y Q.E.D.

Solution 2:

Focus on the number of 2s and 5s that makes up a number. e.g. 150 is made up of 2*3*5*5, there 1 pair of 2&5 so there's one trailing zero. Each time you increase the tested number, try figuring out how much 2 and 5s are in the number. From that, adding up previous results you can easily know how much zeros its factorial contains.

For example, 15!=15*...*5*4*3*2*1, starting from 2:

Number   2s  5s  trailing zeros of factorial
2        1   0   0
3        1   0   0
4        2   0   0
5        2   1   1
6        3   1   1
...
10       5   2   2
...
15       7   3   3
..
24      12   6   6
25      12   8   8   <- 25 counts for two 5-s: 25 == 5 * 5 == 5**2
26      13   8   8 
..   

Refer to Peter de Rivaz's and Dmitry Bychenko's comments, they have got some good advices.

Post a Comment for "Finding Natural Numbers Having N Trailing Zeroes In Factorial"