【问题标题】:Program to find the nth prime number寻找第 n 个素数的程序
【发布时间】:2014-01-27 00:14:11
【问题描述】:

我用python写了一个代码来查找第n个素数。

print("Finds the nth prime number")
def prime(n):
    primes = 1
    num = 2
    while primes <= n:
            mod = 1
            while mod < (num - 1):
                    ptrue = 'true'
                    if num%(num-mod) == 0:
                            ptrue = 'false'
                            break
                    mod += 1
            if ptrue == 'true':
                    primes += 1
    return(num)
nth = int(input("Enter the value of n: "))
print(prime(nth)

代码对我来说看起来不错,但运行时它返回错误:

  Traceback (most recent call last):            
  File "C:/Users/AV/Documents/Python/nth Prime.py", line 17, in <module>           
  print(prime(nth))           
  File "C:/Users/AV/Documents/Python/nth Prime.py", line 13, in prime          
  if ptrue == 'true':
  UnboundLocalError: local variable 'ptrue' referenced before assignment  

在我看来,它似乎是在试图说我在最后一行中指的是 ptrue,即使我不是。这里有什么问题...有人可以帮忙吗?

【问题讨论】:

  • 您只需将ptrue="true" 添加到您的while循环顶部
  • 谢谢,这确实解决了问题,但我的代码似乎没有工作......它只是为每个 n 值打印出 2......这是怎么回事?跨度>
  • 你从未改变过 num 的初始值 2
  • 我刚刚意识到,在输入 num += 1 后,它会比素数更新 1...谢谢大家的支持。

标签: python loops primes


【解决方案1】:

使用Boolean 怎么样?并从while loop中初始化ptrue

print("Finds the nth prime number")
def prime(n):
    primes = 1
    num = 2
    while primes <= n:
            mod = 1
            ptrue = True
            while mod < (num - 1):
                    if num%(num-mod) == 0:
                            ptrue = False
                            break
                    mod += 1
            if ptrue == True:
                    primes += 1
    return(num)
nth = int(input("Enter the value of n: "))

print prime(nth)

【讨论】:

  • 布尔值不起作用。现在其他一切都很好。谢谢!
【解决方案2】:

ptrue 对于你的 while 循环来说是本地的,一旦 while 循环结束,它就会超出范围。所以在你的内部while循环开始之前声明ptrue

【讨论】:

  • 虽然这将解决他的错误......它需要为while循环的每次迭代初始化为true,因为他没有在哪里将它设置为true只有false(IE他假设为true并证明假)
  • ptrue 必须在内部 while 循环开始之前设置为 true
  • 啊啊好点...误读(以为你的意思是外部while循环)
  • Python 中的作用域不是这样工作的。变量不会超出范围。
【解决方案3】:

完全摆脱ptrue 并在您的内部循环中使用else。例如:

while mod < (num - 1):
    if num % (num - mod) == 0:
       break
    mod += 1
else:
    primes += 1   # only executes if loop terminates normally, without `break`

【讨论】:

    【解决方案4】:

    试试这个,我只是对你的做了一些改动

    在这里,我使用all(num%i!=0 for i in range(2,num)) 检查每个素数,检查其余数不等于 0,因此如果该范围为真(从 2 开始且小于自身)它是素数,并且对于 all() 函数如果它是素数,我稍后会帮助我增加“p”计数并检查直到“p”小于“n”(输入数字),所以当它等于条件时,它是我们正在寻找的第 n 个素数。

    n=raw_input("enter the nth prime ")
    num=4
    p=2
    
    while p <int(n):
        if all(num%i!=0 for i in range(2,num)):
            p=p+1   
        num=num+1
    
    print "nTH prime number: ",num-1
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案5】:

    你可以试试这个:

    #This program finds nth prime number
    
    import math
    
    def is_prime(number):
          if number < 2:
                return False
          if number % 2 == 0:
                return False
          else:
                for i in range(3, number):
                      if not number % i:
                            return False
                return True 
    
    
    n = input('Enter n: ')
    
    #This array stores all the prime numbers found till n
    primes = []
    
    for i in range(100000):
          if is_prime(i):
                primes.append(i)
          if len(primes) == n:
                break
    
    print("nth prime number is: " + str(primes[n-1]))
    

    【讨论】:

      【解决方案6】:

      第一部分是定义一个函数,计算给定任意数的下一个素数。

      import math
      
      def is_prime(x): # function
          for i in range(2,int(math.sqrt(x))+1):
              if x%i == 0:
                  return is_prime(x+1)
          return x
      

      例如,is_prime(10) 将返回 11

      下一步是编写一个返回素数列表的生成器。

      def get_prime(k): # generator
          cnt = 1
          n = 2
          while cnt <= k:
              yield(is_prime(n))
              n = is_prime(n) + 1
              cnt += 1
      

      例如,get_prime(5) 将返回 [2,3,5,7,11]

      下面的代码可以帮助您测试结果。

      a = get_prime(50)
      lists = list(a)[:]
      for idx, value in enumerate(lists):
          print("The {idx}th value of prime is {value}.".format(idx = idx+1, value = value))
      

      【讨论】:

        【解决方案7】:

        所有答案都取决于用户输入,但这里有一个简单的代码来给出第 n 个数字,不管 n 有多大......

        def isprime(n):  # First the primality test
            if n<2:
                return False
            for i in range(2,n):
                if n%i==0:
                    return False
                    break
            else:
                return True
        
        def nthprime(n):   # then generic code for nth prime number
            x=[]
            j=2
            while len(x)<n:
                if (isprime(j)) == True:
                    x.append(j)
                j =j+1
            print(x[n-1])
        

        【讨论】:

          【解决方案8】:
          n=int(input('enter n'))
              a=[2,3,5,7]
              i=3
              j=9
          while i<n:
                  flag=0
                  j=j+2
                  for k in range(len(a)):
                      if (a[k]<=int(j**0.5) and j%a[k]==0):
                          flag=1
                          break
                  if flag==0:
                      a=a+[j]
                      i=i+1
          print(a[n-1])
          

          【讨论】:

            【解决方案9】:

            试试这个。

            n = int(input())
            count=1
            u=2
            prime=[]
            
            while(count<=n):
                temp=0
                for i in range(2,u):
                    if(u%i==0):
                        temp=1
                if(temp==0):
                    count+=1
                    prime.append(u)
                u+=1
            
            print(prime[-1])
            

            【讨论】:

              【解决方案10】:

              寻找第 n 个质数的程序。

              def nth_Prime(num):
                  Semi = num*num
                  Res_1 = [True for i in range(Semi+1)]
                  prime = 2
                  while prime*prime <= Semi:
                      if Res_1[prime] == True:
                          for i in range(prime*prime, Semi+1, prime):
                              Res_1[i] = False
                      prime += 1
                  Res_2 = []
                  for i in range(2, Semi+1):
                      if Res_1[i]:
                          Res_2.append(i)
                  return Res_2[num-1]
              
              
              if __name__ == "__main__":
                  num = int(input("Enter nth Number: "))
                  print(nth_Prime(num))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-04-25
                • 1970-01-01
                • 2013-01-22
                • 1970-01-01
                • 2016-02-01
                • 1970-01-01
                • 2015-02-21
                相关资源
                最近更新 更多