0

我正在尝试解决这个问题:哥德巴赫猜想

用程序“goldbach.py​​”证明所有到 1000 的偶数确实可以写成两个素数之和。具体来说:对于每个偶数,还要明确显示(在屏幕上)它可以写成两个素数之和,如下例所示

当然,更重要的是,如果你找到一个不符合哥德巴赫怀疑的数字。确保您的程序在屏幕上清楚地显示这样的发现。答对了!

蟒蛇戈德巴赫.py

16 = ...

18 = 5 + 13

20 = 3 + 17

22 = 5 + 17

24 = ...

进步

到目前为止,我已经创建了一个列表,其中存储了 1000 之前的所有素数,然后我创建了一个列表,其中所有素数的总和为偶数,直到 1000。我知道让它打印的格式3 + 17,但我一直试图让它说 sum(pairs) = prime1 "+" prime2。例如,应该是 3 + 17 = 20。另外,我不知道如何在 1000 之前只有一个素数的总和为偶数的示例。我需要以某种方式打破循环。

因为 sum 函数不起作用,我发现我可以将其转换为“numpy array”,然后使用“accumulate”。我只是无法让它工作,并且知道我收到错误消息'DeprecationWarning:elementwise == comparison failed; 这将在未来引发错误。

有人可以帮我写代码吗?

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

1 回答 1

0

首先,你可以做很多优化来使代码逻辑更好。您找到素数的方式可以改进,您只需要检查直到平方根 n 的数字来验证 n 是否是素数。此外,哥德巴赫猜想的实际验证也可以得到改进。
但是,仅关注当前代码,如果要附加值,则应坚持使用列表,并且要停止代码,您需要使用一种技巧来停止使用for-else语法的嵌套循环。此外,从 python 3.6 开始,您可以使用 f-strings 很好地格式化字符串。

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!!")
于 2019-02-03T12:40:36.213 回答