hi again! at school we were learning about perfect numbers and i thought it would be useful to write a program to find them i currently have this code:

b= 1
h= 1
factors = [1,]
n = float(raw_input("what is the number?"))

while h < n:
        if h*b == n:
                print h, "is not a factor"
                h=h+1
        else:
                if h == 1:
                        print h, "is a factor"
                        h=h+1
                else:
                        print h, "is a factor"
                        factors.append(h)
                        h=h+1


if h <= n:
        b = factors [0:] + factors [:40]
        c = factors [0:] * factors [:40]
        if b==n:
                print n, "is not a perfect number"
        else:
                print "halfway there"
        if c==n:
                print n, "is not a perfect number"
        else:
                print n, "is a perfect number"

but i get the error

Traceback (most recent call last):
File "C:\Python25\perfect nums.py", line 22, in <module>
c = factors [0:] * factors [:40]
TypeError: can't multiply sequence by non-int of type 'list'

can you help please?

thanks in advance

You might want to rethink what the line c = factors [0:] * factors [:40] is doing...

Look at this example for what happens using * on lists:

>>> [ 1, 2, 3 ] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> [ 1, 2, 3 ] * [ 2, 3 ]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'list'

ok can you give me any advice on how to change it to multiply all of the numbers in the list together?

>>> L = range(1, 10)
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> reduce(int.__mul__, L)
362880
>>>

but there are other problems in your program :) for example float should be int . Also, what is b ?

>>> reduce(int.__mul__, L)
362880
>>>

Wow, I really like that.. never used reduce.

A suggestion for the OP: so that the above isn't so cryptic maybe it'll be easier to wrap your head around in this form:

>>> L = range(1,10)
>>> reduce(lambda x, y: x*y, L)
362880
>>>

hi ive just found out that is doesnt work by using

b= 1
h= 1
factors = [1,]
n = float(raw_input("what is the number?"))

while h < n:
        if h*b == n:
                print h, "is not a factor"
                h=h+1
        else:
                if h == 1:
                        print h, "is a factor"
                        h=h+1
                else:
                        print h, "is a factor"
                        factors.append(h)
                        h=h+1


if h <= n:
        for i in factors:
                a=i
                print a
        b = factors [0:] + factors [:40]
        if b==n:
                print n, "is not a perfect number"
        else:
                print "halfway there"
        if b==n:
                print n, "is not a perfect number"
        else:
                print n, "is a perfect number"

you can see that all the numbers smaller than 6 are thought of as a factor i now need lots of help :(

Yes you should figure out the factors portion of your code first... one obvious problem might be that you never change b? So you're always multiplying h*1 ... and secondly, if h*b == n; wouldn't that make h and b both factors of n ??

You can do something like:

inp = user input
for i in (1, inp+1):
    for j in (i, 1, -1):
        if i*j == inp:
            i and j are factors
return factors

i think i know the simplest way of doing this which is to first find the factors like i tried but is there maybe some way of 'factorizing' a number in any of the available modules?

I don't know if there is a module to simply find factors, but it is such a simple operation that you can make your own function... from the psuedo-code I posted eralier:

>>> def get_factors( inp ):
...     ret = [ 1, inp ]
...     for i in xrange( inp + 1 ):
...         for j in xrange( i, 1, -1 ):
...             if i * j == inp:
...                 ret += [ i, j ]
...     ret.sort()
...     return ret
...     
>>> get_factors(6)
[1, 2, 3, 6]

I think the way to go about this is to use modulo or divmod to find the numbers that you can divide the given number by. That is the remainder == 0. You will be working with single numbers which is less confusing. Actually, you can use the (given number / 2) since all numbers greater than the halfway point can't be divided into to the number. Then sum these numbers and see if they add up to the given number.

I played around with a function that returns a list of factors a few months ago. You only need to check numbers up to sqrt(number).

def factors(num):
    outList = [i for i in xrange(1, int(num**0.5)+1) if not num%i]
    if outList:
        outList.extend([num/outList[i] for i in range(len(outList)-[1, 2][outList[-1]**2 == num or 0], -1, -1)])
    return outList

Example:

>>> factors(14564766333)
[1, 3, 13, 39, 1153, 3459, 14989, 44967, 323899L, 971697L, 4210687L, 12632061L, 373455547L, 1120366641L, 4854922111L, 14564766333L]
>>>

def factors(num):
outList =
if outList:
outList.extend([num/outList for i in range(len(outList)-[1, 2][outList[-1]**2 == num or 0], -1, -1)])
return outList

number = int(raw_input("plz enter the number : "))
print factors(number)
outList = factors(number)
result = 0
for x in range (len(outList)):
result += outList[x]
if ((result / 2) == number):
print "the number if perfect"
else:
print "the number isn't perfect"

for number in range (1000):
outList = factors(number)
result = 0
for x in range (len(outList)):
result += outList[x]
if ((result / 2) == number):
print "the %2d is perfect" %(number)
else:
print "the %2d isn't perfect" % (number)

plz some code tags about the code:

[code=python] # Put code inside here

[/code]

This will make your code readable on this forum. Also, as per forum guidelines, if you're asking a new question start a new thread, don't go digging up old threads with a similar topic.

This question has already been answered. Start a new discussion instead.