Reputation: 23
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
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
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
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