首先,我是这个网站的新手和编程,所以如果我的写代码水平不好或我问我的问题是错误的,请指出我正确的方向。
我已经在Python3中编写了一个程序,这使我能够获得所有素数的列表,该列表的数量小于我选择的给定数量N.例如,如果我的输入为10,我的程序将给出以下结果:
>>>primes(10)
[2, 3, 5, 7]
现在我正在尝试编写一个后续程序,它给出了给定数字N的双胞胎数。例如:如果N = 10,我知道有两个双胞胎[3,5]和[5,7]。 我尝试了以下方法:
def twinprimes(n):
x = primes(n)
ps = []
for i in range(len(x)):
if x[i]+2==x[i]:
ps.append((x[i])
return ps
所以我试图制作一个新列表ps
,其中添加了所有双胞胎对的第一个值,以便我可以找到len(ps)
来查找双胞胎的总价值。
现在我知道我的代码有很多问题。我只是不知道如何让它发挥作用。
答案 0 :(得分:1)
您正在尝试测试素数是否等于自身加上2:
if x[i]+2==x[i]:
任何数字都不能等于自身加上非零的其他数字,因此测试永远不会过去。
您想测试当前素数是否比列表中的下一个数字少2:
if x[i] == x[i + 1] - 2: # two adjacent primes differ by 2
这会遇到i + 1
不是x
的有效索引的问题,因为你循环到(但不包括)len(x)
; len(x) + 1
将成为IndexError
。但是你无论如何都不需要测试最后的素数,所以以下方法可行:
for i in range(len(x) - 1):
if x[i] == x[i + 1] - 2:
ps.append((x[i], x[i + 1]))
这会添加两个素数。
有更多pythonic方法可以生成此列表;例如,将素数与zip()
配对,并使用列表理解:
def twinprimes(n):
x = primes(n)
return [(a, b) for a, b in zip(x, x[1:]) if a == b - 2]