质数和元组
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*
有人可以帮我解决这个问题吗?我想我理解那个错误,但我不知道如何修复代码,所以它只是将 p
、p+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
的索引,它是它的一个元素。您需要将包含 val
和 val+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))
我是 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*
有人可以帮我解决这个问题吗?我想我理解那个错误,但我不知道如何修复代码,所以它只是将 p
、p+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
的索引,它是它的一个元素。您需要将包含 val
和 val+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))