为什么我的 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 素数。这不需要太多代码,而且很容易使您当前的方法黯然失色。
我正在用 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 素数。这不需要太多代码,而且很容易使您当前的方法黯然失色。