-2

我正在用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
4

2 回答 2

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

由于完美的数字不能是素数,我决定改变一个筛子来减少要计算的数字量。筛子可以在这里找到Eratosthenes 筛子。那里和维基上有一个关于筛子的很好的解释。

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

这些在理论上有效,但我无法让它在“合理”的时间内工作。

希望这些会有所帮助,直到有人可以发布更有效的解决方案。

于 2019-06-06T23:02:13.487 回答
0

即使您修复了您的代码,这也是寻找完美数字的错误方法 - 您不可能找到超过前四个的,当然也不会找到高达 100,000,000,000,000 的完美数字。

更好的方法是使用Lucas-Lehmer 素数检验来搜索梅森素数,当你找到一个时,计算它的伴生完美数。这不需要太多代码,并且很容易使您当前的方法黯然失色。

于 2019-06-07T20:45:34.760 回答