为什么我的 python 代码不显示我的算法的任何输出?

Why won't my python code display any output for my algorithm?

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

在这两个示例中,我都使用变量 "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. There is a good explanation there and on the 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")

这些在理论上可行,但我无法在 "reasonable" 时间内实现。

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

即使您修改了代码,寻找完美数字的方法也是错误的 - 您找到的可能不超过前 四个,而且肯定不是 100,000,000,000,000 以内的完美数字。

更好的方法是使用 Lucas-Lehmer primality test and when you find one, compute its companion perfect number 搜索 Mersenne 素数。这不需要太多代码,而且很容易使您当前的方法黯然失色。