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

S

SiWi

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

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

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

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.
 
S

SiWi

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

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

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

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.
 
J

Jon Clements

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


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))


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.
 
G

geremy condra

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

I've come to love sympy, personally.
They contain a function to do factorials (and loads more).
120

Geremy Condra
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,812
Latest member
GracielaWa

Latest Threads

Top