【问题标题】:Find the next prime number in Python在 Python 中查找下一个素数
【发布时间】:2020-01-31 11:47:13
【问题描述】:

我有一个函数,它接受一个数字(例如 5)并返回输入数字之后的第一个素数(在本例中为 7)。

这是我的代码:

def prime(n):
    np=[]
    isprime=[]
    for i in range (n+1,n+200):
        np.append(i)
    for x in range(2,199):
        for j in np:
            if x%j!=0:
                isprime.append(x)
    return min(isprime)

但是,此代码不起作用(它总是返回 2)。哪里错了?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    你有一些错误,最值得注意的是np显然是潜在的素数(它从n+1开始,这是第一个符合你标准的潜在数字“输入后的第一个素数number"),但您将 x 添加到来自 range(2,199) 的主要列表中,您应该使用:

    isprime.append(j)
    

    因此,您的素性测试也是错误的,您应该使用:

    j % x != 0
    

    最后,如果该条件在一种情况下为真,则不能附加数字,它必须在所有种情况下都为真(其中 x 是满足 2 <= x < j 的整数),因为为此,您应该切换第二组 for 循环(x 循环应该是内部循环),并且您还应该只循环到j-1(被测试的数字)。此外,如果j % x == 0

    ,您应该选择添加项目
    for ...:
        val_is_prime = True
        for ...:
            if j % x == 0:
                val_is_prime = False
                break
        if val_is_prime:
            isprime.append(j)
    

    这会产生以下代码:

    def prime(n):
        np=[]
        isprime=[]
        for i in range (n+1,n+200):
            np.append(i)
        for j in np:
            val_is_prime = True
            for x in range(2,j-1):
                if j % x == 0:
                    val_is_prime = False
                    break
            if val_is_prime:
                isprime.append(j)
        return min(isprime)
    

    并试运行:

    >>> prime(5)
    7
    >>> prime(13)
    17
    >>> prime(23)
    29
    

    请注意,还可以进行其他几项效率改进,但此答案侧重于错误而不是改进

    【讨论】:

      【解决方案2】:

      试试这个,这是我发现的最pythonic和最清晰的方法(但可能不是最有效的):

      def is_prime(x):
          return all(x % i for i in range(2, x))
      
      def next_prime(x):
          return min([a for a in range(x+1, 2*x) if is_prime(a)])
      
      print(next_prime(9))
      

      【讨论】:

        【解决方案3】:

        https://www.geeksforgeeks.org/python-simpy-nextprime-method/

        from sympy import *
          
        # calling nextprime function on differnet numbers 
        nextprime(7) 
        nextprime(13) 
        nextprime(2)
        

        输出:

        11 17 3

        【讨论】:

          【解决方案4】:

          此代码有效。

          def prime(n):
              next_prime = n + 1
              prime = True
              while True:
                  for i in range(2, next_prime):
                      if next_prime%i ==0:
                          prime = False
                          break
                  if prime:
                      return next_prime
                  else:
                      next_prime = next_prime + 1
                      if next_prime % 2 == 0:
                          next_prime = next_prime + 1
                      prime = True
          
          
          if __name__=="__main__":
              print(prime(5))
          

          【讨论】:

            【解决方案5】:

            这是一个工作示例。

            inputNumber = int(input("Enter number to find next prime: "))
            
            def nextPrime(inputNum):
            
                for nextNumToChk in range(inputNum+1, inputNum +200):
                    if nextNumToChk > 1:
                        # If num is divisible by any number between 2 and val, it is not prime
                        for i in range(2, nextNumToChk):
                            if (nextNumToChk % i) == 0:
                                break
                        else:
                            #found the prime
                            return nextNumToChk
            
            result = nextPrime(inputNumber)
            print "Next Prime is : ",result
            

            输出:-

            Enter number to find next prime: 5
            Next Prime is :  7
            

            【讨论】:

              【解决方案6】:
              def is_prime(n):
                  # Corner case
                  if n <= 1:
                      return False
                  # Check from 2 to n-1
                  for i in range(2, n):
                      if n % i == 0:
                          return False
                  return True
              
              def first_prime_over(n):
                  prime_number = (i for i in range(n) if is_prime(i))
                  try:
                      for i in range(0,n):
                          (next(prime_number))
                  except StopIteration:
                      prime_number_next = (i for i in range(n,n+1000) if is_prime(i))
                      print(next(prime_number_next))
              first_prime_over(10)
              

              【讨论】:

                【解决方案7】:

                试试这个:

                def find_next_prime(n):
                    return find_prime_in_range(n, 2*n)
                
                def find_prime_in_range(a, b):
                    for c in range(a, b):
                        for i in range(2, c):
                            if c % i == 0:
                                break
                        else:
                            return c
                    return None
                
                def main():
                    n = int(input('Find the next prime number from: '))
                    print(find_next_prime(n+1))
                
                if __name__ == '__main__':
                    main()
                

                【讨论】:

                  【解决方案8】:
                  n = int(input("Enter a number"))
                  
                  while True:
                      n+=1
                      for  x in range(2,n):
                          if n%x==0:
                             break
                      else:
                           print("next prime number is",n)
                           break
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-01-10
                    • 2014-07-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-01-25
                    • 2016-01-19
                    相关资源
                    最近更新 更多