首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >你如何找到第一个m孪生素数?

你如何找到第一个m孪生素数?
EN

Stack Overflow用户
提问于 2019-11-24 19:06:03
回答 3查看 624关注 0票数 1

我的程序应该找到第一个m个孪生素数并打印出来。

代码语言:javascript
运行
复制
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已经实现,以检查一个数字是否为素数。它会返回答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-25 07:05:35

正如@JayMody注意到的那样,您的isItPrime()被破坏了。我们可以让它按预期工作,但是它依赖于用越来越多的参数调用它的方式,以及它使用全局素数列表的方式,都是问题。(即考虑先调用isItPrime(22),然后调用isItPrime(6))

@JohanC的答案,你接受了,并没有保持一个全球主要列表,而是做更多的除法,通过测试所有的数字从2到数字。这远远低于您试图实现的效率。我认为我们可以挽救您的初衷,而不是公开一个非一般的isItPrime()测试,方法是将一个函数内部提供给另一个函数:

代码语言:javascript
运行
复制
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发布的速度更快,但它的设计是为了找到所有的对,直到某个数目,而不是像您指定的那样找到一些对。

票数 1
EN

Stack Overflow用户

发布于 2019-11-24 19:26:04

请将您的代码与函数和错误一起发布。

否则,尝试如下:

代码语言:javascript
运行
复制
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) 
票数 2
EN

Stack Overflow用户

发布于 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.
  • You有一个变量i,您只需要给出1和print的值,但是不要做任何有用的事情。
  • Python代码如果缩进四个空格而不是只有2个

,则更容易阅读。

以下是修改后的代码:

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
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:如果你愿意,你可以写

代码语言:javascript
运行
复制
    if isItPrime(a):
        if isItPrime(b):
            if b - a == 2:

作为

代码语言:javascript
运行
复制
    if isItPrime(a) and isItPrime(b) and b - a == 2:
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59021337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档