我创建了一个函数来查找将加起来给定数字的所有素数组合。它的工作非常精彩,除了第二个元组,我总是关闭。代码构造的方式总是返回给定元组的两个变体,例如(5,13)和(13,5),但这个不正确的元组总是单独的。
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i]
if result == number:
prime_tup_list.append((x, y))
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
如果我输入56作为我的号码,我会得到这个输出:
[(3, 53), (5, 53), (13, 43), (19, 37), (37, 19), (43, 13), (53, 3)]
对于36我得到:
[(5, 31), (7, 31), (7, 29), (13, 23), (17, 19), (19, 17), (23, 13), (29, 7), (31, 5)]
答案 0 :(得分:1)
直接在第一个for
循环内的这个条件似乎是引起问题的那个 -
if result == number:
prime_tup_list.append((x, y))
如果发现result
等于第二个for循环内的数字,则将其添加到prime_tup_list
,但如果这是列表中的最后一个素数,结果没有更改,我们退出第二个for
循环(仍然是相同的result
),并在第一个for
循环的下一次迭代中,您接下来的x
值,但在再次计算result
之前,检查result
是否等于number
,如果是x
(新x
,则不是一个用于计算列表中的result
)和y
。
您可以完全删除if
条件,但不确定它为什么存在。
修改强>:
代码 -
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i] #if below here is removed.
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
答案 1 :(得分:1)
您还可以在第二个for
循环中编辑范围,以避免重复!
def g(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
for i in range(len(prime_list)):
x = prime_list[i]
for j in range(i, len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
输出:
分别为56和36
[(3, 53), (13, 43), (19, 37)]
[(5, 31), (7, 29), (13, 23), (17, 19)]