0

我一般是编程新手,我正在尝试用 Python 做“哥德巴赫理论”,即 3 和给定数字之间的每个数字(在我的例子中是 50。)

lijst2 = []
for n in lijst:
    j = 2*n+1
    lijst2.append(j)


priemgetallen = [2]
counter = 2
x = 2
while len(priemgetallen)<50:
    priemgetallendelers = []
    for i in range (1,counter+1):
        if counter % i == 0:
            priemgetallendelers.append(i)
    if len(priemgetallendelers) == 2:
        priemgetallen.append(counter)
        counter += 1
    else:
        counter +=1

上面的代码对我的问题并不重要,只是为了更容易理解我想要做什么。

while not len(sommen) == len(lijst2):
    for i in lijst2:
        for j in priemgetallen:
            for r in priemgetallen:
                for t in priemgetallen:
                    if i == j+r+t:

在这里,我想说的是,如果我的原始列表中的一个数字是由三个素数之和组成的,请将其添加到列表中。

                        sommen2 = []
                        sommen2.append(j)
                        sommen2.append(r)
                        sommen2.append(t)

所以直到这里一切都可以正常工作,但如果我让它打印出输出,我会得到数倍相同的“I”,或者更确切地说是素数的相同总和。

                        for q in sommen:
                            if not sum(sommen2) == sum(q):
                                sommen.append(sommen2)

在这里,我想说的是,对于我的列表“sommen”中的 aq,如果该 q 的总和已经存在,则不要添加另一个。但是我的笔记本电脑只是计算了很长时间。

print (sommen)
4

3 回答 3

0

首先回答您的原始问题:

问题在于您在sommen仅检查一项时迭代了整个项目sommen2。假设sommen包含 9 个值,其中一个等于sommen2' 的总和,您仍然sommen2要追加 8 次。

我会使用 dict 来全面重写您的程序,如下所示:

sum_summands = dict()
# found a candidate i=j+r+t here
sum_summands[i] = (j,r,t)  #use tuple not list
# or if you want to always keep the first candidate you've found
if i not in sum_summands:  # don't overwrite if sum i already exists
    sum_summands[i] = (j,r,t)

您可以在算法中优化很多其他的东西。让我指出最明显的一个。而不是这样做 -

for i in lijst2:
    for j in priemgetallen:
        for r in priemgetallen:
            for t in priemgetallen:
                if i == j+r+t:

你为什么不摆脱最里面的循环 -

for i in lijst2:
    for j in priemgetallen:
        for r in priemgetallen:
            if i-j-r in priemgetallen:

仅仅为了检查它们加起来是否达到某个总和而遍历大量数字是没有意义的——你应该做一些最低程度的数学来简化事情。

于 2017-06-14T16:34:21.923 回答
0

问题是以下代码:

                    for q in sommen:
                        if not sum(sommen2) == sum(q):
                            sommen.append(sommen2)

如果我理解正确,您想将 sommen2 添加到 sommen,如果其总和尚未在 sommen 中。但是你所做的是,你将它添加到 sommen 中,用于 sommen 中与 sommen2 的总和不同的每个元素。将其替换为以下内容:

                    if not any(sum(sommen2) == sum(q) for q in sommen):
                        sommen.append(sommen2)
于 2017-06-14T16:36:45.647 回答
0

问题是你的循环。您不止一次返回相同的总和,因为您的循环将[1, 7, 5]与不同[5, 7, 1]视为不同[7, 5, 1],依此类推。

清理循环是这样的。

import itertools

l = [10, 15, 4, 2, 7, 20]

p = [1, 2, 3, 5, 7, 11, 13]

sommen = []

for v in map(lambda x: sum(x), itertools.combinations(p, 3)):
    if v in sommen:
        pass
    elif v in l:
        sommen.append(v)

print sommen

>> [10, 15, 20]

正如预期的那样

            2 + 3 + 5 = 10
            3 + 5 + 7 = 15
            2 + 7 + 11 = 20

请注意 1 + 2 + 7 也给出 10 但 10 没有添加两次

注意 2 + 5 + 13 也给出 20 但 20 没有加两次

编辑:如果您想查看其中的因素:

for combo in itertools.combinations(p, 3):
    if sum(combo) in map(lambda x: x[0],sommen):
        pass
    elif sum(combo) in l:
        sommen.append([sum(combo), combo])

print sommen

>> [[10, (1, 2, 7)], [15, (1, 3, 11)], [20, (2, 5, 13)]]
于 2017-06-14T16:26:11.760 回答