Aayush Pandey
Aayush Pandey

Reputation: 23

Python Perfect Number Search

so I wanted to code a program that finds perfect numbers. I made a draft however it prints irrelevant numbers. Please let me know how to fix this program.

f = []

p = []

for i in range(2, 100):
    for k in range(1, i):
        if i % k == 0:
            f.append(k)
    if sum(f) == i:
        p.append(i)

print(p)

Upvotes: 2

Views: 751

Answers (3)

Naive Developer
Naive Developer

Reputation: 710

You have clean f every time and don't include the last number.

p = []

for i in range(2, 500):
    f = [] #clean f
    for k in range(1, i): 
        if i % k == 0:
            f.append(k)
    if sum(f) == i:
        p.append(i)

print(p)

Upvotes: 0

cdlane
cdlane

Reputation: 41905

I believe this is what folks are suggesting you do:

perfect = []

for candidate in range(2, 10000):
    factors = []

    for number in range(1, 1 + candidate // 2):
        if candidate % number == 0:
            factors.append(number)

    if sum(factors) == candidate:
        perfect.append(candidate)

print(perfect)

Note that this approach won't get you more than the first four perfect numbers. After that, it's too slow to find the next one in a reasonable amount of time. If you want to find more of them, you need to use an efficient Mersenne prime search and calculate the companion perfect number for each Mersenne prime.

Upvotes: 1

Nie Selam
Nie Selam

Reputation: 1451

Perfect number is just a number which is equal to the sum of its prime factors, excluding itself.

def perfect(num):
    prime_factors=[1] #since 1 is a prime factor of each number, add it
    for i in range(2,num):
        if num%i==0:
            #i is the numbers prime factor
            prime_factors.append(i)

    if sum(prime_factors)==num:
        return True #the sum of its prime factors equals the numbers so the number is perfect number

    return False

Check results:

print(perfect(70)) factors: [1 +2+ 5+ 7+ 10+14+35]!=70 so False
print(perfect(28)) factors: [1+2+4+7+14]==28 so True

Upvotes: 0

Related Questions