我试图解决这个问题:哥德巴赫猜想
显示与程序“goldbach.py”所有偶数高达1000的确可以写成两个素数之和。具体做法是:对于每个偶数,也明确地显示(在屏幕上),它可以写为两个素数的总和,如在下面的例子
更重要的是,当然,如果你发现了一些不符合哥德巴赫的怀疑。确保程序中可以清晰地显示在屏幕上这样的发现。答对了!
16 = ...
18 = 5 + 13
20 = 3 + 17
22 = 5 + 17
24 = ...
进展
到目前为止,我已经创建,所有的素数,直到1000存储一个列表,然后我创建的所有素数,其总和为偶数,直到1000组合我知道的格式将它打印列表3 + 17,但我被困在试图把它说总和(对)= prime1“+” prime2。应为3 + 17 = 20例如。另外,我不知道怎么只有1一对素数谁的总和的例子是偶数,直到1000我需要打破循环一些如何的。
因为SUM函数不能正常工作,我发现我可以将其转换为“numpy的阵列”,然后使用“积累”。我只是无法得到它的工作,知道我收到错误消息“DeprecationWarning:按元素==比较失败;这将在未来引发错误“。
可能有人帮助我的代码?
from itertools import accumulate, islice
from numpy import array
import numpy as np
primes = []
pairs = []
numpy_pairs = np.asarray(pairs)
for num in range (4, 1000):
for j in range (2, num):
if (num % j) == 0:
break
else:
primes.append(num)
#for x in range(2,1000):
# if x in primes:
# print ("Ja, het getal {} komt voor in mijn primes".format(x))
for x in range(2,1000):
if x % 2 == 0:
for prime1 in primes:
for prime2 in primes:
if prime1 + prime2 == x and [prime1, prime2] not in numpy_pairs and [prime2, prime1] not in numpy_pairs:
np.append(numpy_pairs,[prime1,prime2])
results = ("{}+{}={}".format(i, j, k) for i, j in zip(numpy_pairs[0::2],
numpy_pairs[1::2]) for k in accumulate(islice(numpy_pairs,numpy_pairs.stop)))
print('\n'.join(results))
首先第一件事情,也有很多的优化,你可以做,使代码逻辑更好。你发现的素数可提高的方式,你只需要检查数字高达平方根n以验证n是一个素数。而且,Goldbachs猜想实际验证可也得到了改善。 然而,仅仅着眼于当前的代码,你应该坚持,如果你要追加值使用列表,并停止你需要使用一种黑客使用for-else语法来停止嵌套循环的代码。此外,您还可以使用F-字符串从蟒蛇3.6起良好的格式化字符串。
primes = []
pairs = []
for num in range (2, 1000): #modified. you forgot 2 and 3!
for j in range (2, num):
if (num % j) == 0:
break
else:
primes.append(num)
result = []
for x in range(2,1000):
if x % 2 == 0:
for prime1 in primes:
for prime2 in primes:
if prime1 + prime2 == x:
print(f"{x} = {prime1} + {prime2}")
result.append((prime1, prime2))
break
else: #this is a for-else syntax. enter this block if the for loop did not encounter a break
continue #go to next iteration of the mid-level loop. This prevents the line afterwards from being executed in cases where the inner loop did not "break"
break #break the mid level loop if you reach this line.
else:
print("You have done it! Bingo!!")