Sum of the factorial of the digits of a number - wierd behaviour

Jon Clements joncle at googlemail.com
Wed Dec 9 15:21:34 EST 2009


Even though you've worked it out -- a couple of tips:

On Dec 9, 5:39 pm, SiWi <wimmersi... at googlemail.com> wrote:
> On Dec 9, 6:36 pm, SiWi <wimmersi... at googlemail.com> wrote:
>
>
>
> > Dear python community,
> > I've got a wierd problem and I hope you can help me out at it.
> > I wrote the following code to find the Sum of the factorial of the
> > digits of a number (this is for Project Euler 74):
>
> > def fac(n):
> >     x=1
> >     for i in range(2,n+1):
> >         x*=i
> >     return x
>

numpy/scipy etc... are quite useful for Euler :)

They contain a function to do factorials (and loads more).

This to one of the readable uses of 'reduce':
def fac(n):
    reduce(operator.mul, xrange(2, n+1), n)

> > t=tuple(fac(n) for n in range(1,10))
>
> > def decimals(x):
> >     i=1
> >     d=[]
> >     while x>0:
> >         d.append(x%10)
> >         x=x/10
> >     return d

The builtin str object can take integers and return it as a string.


def decimals(x):
    return map(int, str(x))
decimals(145) == [1, 4, 5]

>
> > def sumfac(x):
> >     return sum(t[n-1] for n in decimals(x))
>

And join the two:
print sum(fac(n) for n in decimals(145))



> > The problem is that i get the following results, for which I can't see
> > any reason:
> > sumfac(145)->145 (1!+4!+5!=1 + 24 +120 = 145) - ok
> > sumfac(1454)-> 169 - ok
> > sumfac(45362) -> 872 - ok
> > sumfac(363600) -> 727212 - wrong, should be1454
>
> > Greetings,
> > SiWi.
>
> Oops, found it myself. You can ignote the message above.

You might also find it useful to write generators (esp. for primes and
factorials).

Cheers,

Jon.



More information about the Python-list mailing list