[Tutor] Need help with Factorial algorithm using Python

John Fouhy john at fouhy.net
Sat Sep 6 04:40:09 CEST 2008


2008/9/5 Terry Carroll <carroll at tjc.com>:
> So here's my routine to address the problem.  It consists of making a
> multiplication table of coefficients that includes the factor such as 5,
> 25, 125, etc., and their values (1, 6, 31, etc).  Then, starting with the
> highest ones first, successievely determining how many times each factor
> goes into the number of zeroes.  For example, to do the prior example
> working backwards, what factorial will give you 71 zeroes?

I think there is a simpler solution :-)

You can count the number of fives in the prime decomposition of a
number by just dividing by 5 repeatedly until you don't get a whole
number.

You can then find n such that n! has x zeroes by just starting with
n=0 and counting up, adding the appropriate amount at each step.

Code:

from __future__ import division
import operator

def fac(n):
    """ Return n! """

    return reduce(operator.mul, range(1, n+1))

def zeroes(n):
    """ Count number of zeroes in n! """

    f = fac(n)
    return len(str(f))-len(str(f).rstrip('0'))

def fives(n):
    """ Count number of 5s in prime factor decomposition of n. """
    i = 0
    while (n/5) == (n//5):   # note future division in effect
        i += 1
        n = n//5
    return i

def zeroes_inv(x):
    """ Return n such that zeroes(n) == x. """

    i = 0
    count = 0
    while count < x:
        i += 5
        count += fives(i)
    return i

Although I am curious to know how long it took your algorithm to find
the answer for 7**20 ...

-- 
John.


More information about the Tutor mailing list