我的程序应该找到第一个m个孪生素数并打印出来。
def isItPrime(n):
tests = primes.copy()
while len(tests) != 0:
if n % tests[-1] == 0:
return False
elif n % tests[-1] != 0:
tests.pop()
if len(tests) == 0:
primes.append(n)
return True
def findTwinPrimes(a , b):
if isItPrime(a) == True:
if isItPrime(b) == True:
if b - a == 2:
print(a, "-", b, "is a twin prime")
def firstMTwinPrimes(m):
o = 0
i = 1
if o < m :
print(i)
k = 3
l = 5
findTwinPrimes(k,l)
k += 1
l += 1
o += 1
firstMTwinPrimes(7)
目前,它运行没有错误,但也不工作。I是检查程序运行了多少次,并且只运行了一次。我不知道为什么,因为如果o小于m,它应该再次运行。对于3和5,它们是孪生素数,但对它们不起作用。isItPrime已经实现,以检查一个数字是否为素数。它会返回答案。
发布于 2019-11-25 07:05:35
正如@JayMody注意到的那样,您的isItPrime()
被破坏了。我们可以让它按预期工作,但是它依赖于用越来越多的参数调用它的方式,以及它使用全局素数列表的方式,都是问题。(即考虑先调用isItPrime(22)
,然后调用isItPrime(6)
)
@JohanC的答案,你接受了,并没有保持一个全球主要列表,而是做更多的除法,通过测试所有的数字从2到数字。这远远低于您试图实现的效率。我认为我们可以挽救您的初衷,而不是公开一个非一般的isItPrime()
测试,方法是将一个函数内部提供给另一个函数:
def firstMTwinPrimes(m):
primes = [2]
def isItPrime(n):
for prime in primes:
if prime * prime > n:
break
if n % prime == 0:
return False
primes.append(n)
return True
number = 3
count = 0
while count < m:
for n in range(number, number + 3, 2):
if n == primes[-1]:
continue
if not isItPrime(n):
break
else: # no break
print(number, "-", number + 2, "are twin primes")
count += 1
number += 2
我们必须小心,不要在列表中添加两次质数,当它被测试为一个较低和更高的数字时。当M
超过100时,您会发现这种方法比@JohanC的回答快几个数量级。你走在正确的轨道上。
基于筛网的解决方案@AlokMishra发布的速度更快,但它的设计是为了找到所有的对,直到某个数目,而不是像您指定的那样找到一些对。
发布于 2019-11-24 19:26:04
请将您的代码与函数和错误一起发布。
否则,尝试如下:
def printTwinPrime(n):
prime = [True for i in range(n + 2)]
p = 2
while (p * p <= n + 1):
# If prime[p] is not changed,
# then it is a prime
if (prime[p] == True):
# Update all multiples of p
for i in range(p * 2, n + 2, p):
prime[i] = False
p += 1
# check twin prime numbers
# display the twin prime numbers
for p in range(2, n-1):
if prime[p] and prime[p + 2]:
print("(",p,",", (p + 2), ")" ,end='')
# driver program
if __name__=='__main__':
# static input
n = 7
# Calling the function
printTwinPrime(n)
发布于 2019-11-24 20:12:06
几点意见:
if o < m
更改为while循环:while o < m
。只有如果测试,findTwinPrimes
只被调用一次。你需要一次又一次的调用它,直到你有足够的孪生素数。在这个when -循环中,只有当您真正找到孪生素数时,才需要增加o
。因此,findTwinPrimes
在找到孪生素数时应该返回True,如果没有返回True,则应该将k=3; l=5
放在while-循环开始之前,这样它们就可以在循环中增加。if isItPrime(a) == True:
-最好只编写if isItPrime(a):
。这具有相同的效果,而且更多的readable.i
,您只需要给出1
和print的值,但是不要做任何有用的事情。,则更容易阅读。
以下是修改后的代码:
def isItPrime(p):
for i in range(2, p):
if p % i == 0:
return False
return True
def findTwinPrimes(a, b):
if isItPrime(a):
if isItPrime(b):
if b - a == 2:
print(a, "-", b, "is a twin prime")
return True
return False
def firstMTwinPrimes(m):
o = 0
k = 3
l = 5
while o < m:
if findTwinPrimes(k, l):
o += 1
k += 1
l += 1
firstMTwinPrimes(7)
输出:
3 - 5 is a twin prime
5 - 7 is a twin prime
11 - 13 is a twin prime
17 - 19 is a twin prime
29 - 31 is a twin prime
41 - 43 is a twin prime
59 - 61 is a twin prime
PS:如果你愿意,你可以写
if isItPrime(a):
if isItPrime(b):
if b - a == 2:
作为
if isItPrime(a) and isItPrime(b) and b - a == 2:
https://stackoverflow.com/questions/59021337
复制相似问题