繁体   English   中英

素数和元组

[英]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))

在第一个循环中,我确定该范围内的哪些数字是素数,append 它们到list_primes

在第二个循环中,我尝试将list_primes和 append 中的素数作为元组放入list_final

它告诉我:

list_final.append((list_primes[val], list_primes[val + 2]))
IndexError:列表索引超出范围*

有人可以帮我吗? 我想我理解这个错误,但我不知道如何修复代码,所以它只需要pp+2进入一个元组,然后它会需要另一对等等......它甚至必须忽略 23虽然它是质数。

您对双胞胎进行迭代的逻辑是不正确的。 val设置为列表本身中的元素,而不是索引。 您将其视为索引。 您需要迭代一系列数字,而不是元素本身。 我建议使用步长为 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的索引,它是它的一个元素。 您需要 append 一个包含valval+2list_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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM