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

时间:2019-06-06 20:29:19

标签: python algorithm perfect-numbers

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

2 个答案:

答案 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。这不需要太多代码,并且很容易使您的当前方法黯然失色。