质数和元组

Prime numbers and tuples

我是 python 的初学者,我正在解决一个我无法解决的问题。

我应该做的:创建一个素数元组列表,范围是两个数字(也是素数)并且该列表中的元组应该只包含 2 个素数 p 和 p+2

例如:给定范围(11, 31) 返回列表= [(11, 13), (17, 19) , (29, 31)]

这是我的代码

def twin_primes(a: int, b:int) -> List[Tuple[int, int]]:

    list_primes = []
    list_final = []
    for val in range (a, b+1):
        if val > 1 :
            for n in range(2, val):
                if (val % n) == 0:
                    break
            else:
                list_primes.append(val)
    for val in list_primes:
        print(val)
        list_final.append((list_primes[val], list_primes[val + 2]))
    return list_final

print(twin_primes(11,31))

在第一个 for 循环中,我确定该范围内的哪些数字是质数并将它们附加到 list_primes

在第二个 for 循环中,我尝试从 list_primes 中取出质数并将它们作为元组附加到 list_final

它告诉我这个:

list_final.append((list_primes[val], list_primes[val + 2]))
IndexError: list index out of range*

有人可以帮我解决这个问题吗?我想我理解那个错误,但我不知道如何修复代码,所以它只是将 pp+2 放入一个元组中,然后再使用另一对,依此类推......还有它必须忽略 23,即使它是质数。

您迭代双胞胎的逻辑不正确。 val 设置为列表本身中的元素,而不是索引。您将其视为索引。您需要遍历 range 个数字,而不是元素本身。我建议使用步长为 2 的范围。

list_primes = []
list_final = []
for val in range (a, b+1):
    if val > 1 :
        for n in range(2, val):
            if (val % n) == 0:
                break
        else:
            list_primes.append(val)

for i in range(0, len(list_primes) - 1, 2):
    list_final.append((list_primes[i], list_primes[i + 1]))
return list_final

当 a = 11 且 b = 31.

时产生 [(11, 13), (17, 19), (23, 29)]

但是您的逻辑仍然需要一些调整,因为这会在 a = 50 和 b = 100 时产生 [(53, 59), (61, 67), (71, 73), (79, 83), (89, 97)],显然这是不正确的。

val 不是 list_primes 的索引,它是它的一个元素。您需要将包含 valval+2 的元组附加到 list_final,但前提是 val+2 在素数列表中。

for val in list_primes:
    if val+2 in list_primes:
        list_final.append((val, val+2))

这可以使用 enumerate() 进行改进,因为如果 val+2 存在,它总是会成为下一个素数。

for i, val in enumerate(list_primes[:-1]):
    if list_primes[i+1] == val + 2:
        list_final.append((val, val+2))