我正在尝试解决这个问题:哥德巴赫猜想
通过程序``goldbach.py''显示最大不超过1000的所有偶数都可以写成两个素数的和。具体来说:对于每个偶数,还(在屏幕上)明确显示它可以写成两个质数之和,如下面的示例
如果您发现一个不符合哥德巴赫猜想的数字,那么当然更重要。确保您的程序在屏幕上清楚地显示了这样的发现。宾果游戏!
16 = ...
18 = 5 + 13
20 = 3 + 17
22 = 5 + 17
24 = ...
进度
到目前为止,我已经创建了一个列表,其中存储了直到1000的所有素数,然后创建了一个列表,其中所有和数的和的组合直到1000为止都是偶数。我知道格式将其打印为3 + 17,但我只能尝试说sum(pairs)= prime1“ +” prime2。例如,应为3 + 17 = 20。另外,我不知道如何只有两个素数对的示例,它们的和是偶数,直到1000。我需要以某种方式打破循环。
因为求和函数不起作用,我发现我可以将其转换为“ numpy数组”,然后使用“累加”。我只是无法正常工作,并且知道我收到错误消息“ DeprecationWarning:elementwise ==比较失败;将来会引发错误。'
有人可以帮助我提供代码吗?
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))
答案 0 :(得分: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!!")