我正在使用python创建一个算法,以查找最高达100000000000000的完美数字。为此,我已经创建了一些应该执行的代码,它不会引发任何错误,但是代码只是什么也没有输出,并且一直在运行。我已经检查过了,第一个完美的数字是六个,那为什么我的程序要花这么长时间才能到达那里?
这是我的代码:
number = 1
divisor = 2
factors = 1
if number < 100000000000000:
while True:
number2 = number/divisor
if isinstance(number2, int):
factors = factors + divisor + number2
divisor = divisor + 1
if divisor == number:
if factors == number:
print(number)
number = number + 1
break
答案 0 :(得分:0)
在这两个示例中,我都将变量“ j”用作目标编号。
这是我的第一个想法,但是请不要在大于10000的任何东西上使用它:
print([i for i in range(1,j+1) if i == sum(k for k in range(1,i//2+1) if i%k == 0)])
由于完美数字不能为素数,因此我决定更改一个筛子以减少要计算的数量。筛子可以在这里Sieve of Eratosthenes中找到。那里以及wiki上关于筛子的解释都很好。
def SieveOfEratosthenes(n):
prime = [True for i in range(n+1)]
p = 2
while (p * p <= n):
if (prime[p] == True):
for i in range(p * 2, n+1, p):
prime[i] = False
p += 1
for p in range(2, n):
if not prime[p]:
#this is my change
if p == sum(k for k in range(1,p//2+1) if p%k == 0):
yield p
a = SieveOfEratosthenes(j)
b = next(a)
print(b)
try:
while b < j:
b = next(a)
print(b)
except StopIteration:
print("Done")
这些在理论上是可行的,但我无法使其在“合理的”时间内工作。
希望这些将对您有所帮助,直到有人可以发布更有效的解决方案为止。
答案 1 :(得分:0)
即使您修复了代码,这也是寻找完美数字的错误方法-您找到的数字不可能超过前四个 ,当然不会高达100,000,000,000,000的整数。
一种更好的方法是使用Lucas-Lehmer primality test搜索梅森素数,找到后,计算其companion perfect number。这不需要太多代码,并且很容易使您的当前方法黯然失色。