[Tutor] Can my code be optimized any further (speed-wise)?

Geoframer geoframer at gmail.com
Sun Oct 8 08:41:50 CEST 2006


The problem is that these assignments are evaluated automatically. So i can
not use description strings to clearify output or input etc.

Basically it's like this:

a = the number of times i'm going to read input to evaluate
lst = the factors of 5. I.e. (5, 5^2, 5^3, 5^4.... etc) until the last one
wich is smaller then 1000000000

For those that didn't know the number of trailing zero's in a factorial is
decided by the numer of factors of 5, because only a 5 can create a 0.
Remember a factorial (n) = n*....*4*3*2*1. The list does not represent
factorials.

Example input of this program:
5                                 #number of times i'm going to read in a
number
3                                 # 3! = 6, no trailing 0's zo the output
would be 0
5                                 # 5! = 120, 1 trailing 0's so the output
would be 1
50!                              #50!=  <very big number>, 12 trailing 0's
(50/5 + 50/25=12)
100!                            #100!= <very big number>, 24 trailing 0's
(100/5 + 100/25 = 24)
125!                            #125!= <very big number>, 31 trailing 0's
(125/5 + 125/25 +125/125 = 31)

Output would be:
0
1
12
24
31

Hope this clarifies what i'm trying to achieve here...

Ciao - Geofram


On 10/8/06, Alan Gauld <alan.gauld at btinternet.com> wrote:
>
> Hi,
>
> Maybe its just me but I didn't understand what you are
> trying to do...
>
> > The problem is to compute the number of trailing zero's in
> > factorials (n! =
> > 1*2*3*4*.......*n). with n <= 1000000000
> >
> > My solution is as follows (a = times to read a number (b) to
> > process) :
> >
> >
> ---------------------------------------------------------------------------
> >
> > a = input()
>
> what does a represent? Its usually worth putting a prompt string into
> input() - and raw_input() - just as documentation if nothing else!
> And maybe a descriptive variable name if appropriate.
>
> > for i in range(a):
> >    lst = (5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125,
> > 9765625,
> > 48828125, 244140625)
>
> None of these have any trailing zeros so far as I can tell?
> What answer are you expecting from this function?
>
> >    ans = 0
> >    b = input()
>
> similarly, what is b supposed to be?
>
> >    for i in lst:
>
> And here you are throwing away the i from the outer loop
>
> >        if i <= b:
> >            ans += b//i
>
> And now you divide some arbitrary input value by each factorial
> in turn and sum the results?
>
> >    print ans
>
> > Please, if you have suggestions to improve the speed of this
> > algorithm give
> > an argumentation as to why a certain something is faster.
>
> I nbeed to understand what you are tryying to do first, its
> not making much sense at the moment. (But it is after midnight! :-)
>
> > P.s. I know python is probably not the best language for these kinds
> > of
> > problems (I can code it in C or C++), it just bugs me that it's
> > possible
> > and my solution is failing...  ;-)
>
> Actually it looks like exactly what I would use Python for rarther
> than C/C++. The speed issue can be solved in numerous ways but
> as always lets be sure we get the functionality clear before starting
> to optimise things.
>
> Alan G.
>
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20061008/fc7552c3/attachment.html 


More information about the Tutor mailing list