【问题标题】:how to find a prime number function in python如何在python中找到素数函数
【发布时间】:2014-12-05 06:52:31
【问题描述】:

我开始回到 python 编码,并意识到我无法完全弄清楚这一点。我正在尝试编写素数函数。有人可以帮忙吗?

这是我的代码:

def is_prime(x):
a = True
for n in range(2, x-1):
    while n < x:
        n+=1
        if x % n == 0:
            a = False
        elif n < 2:
            a = False
        else:
            a = True
        break
    break
return a

如果有人知道我做错了什么,请告诉我。一个月前我试过这个,但无法理解逻辑。我想我被难住了,从来没有寻求帮助......另外,你认为我应该尝试多久才能平均寻求帮助?

【问题讨论】:

  • 你最好检查 range(a, b, step=1), start = 2 的定义,但是 n==0, 1 在里面...
  • 请不要在人们回答后对问题和代码进行实质性编辑。

标签: python boolean logic primes boolean-logic


【解决方案1】:

如前所述,您可以通过检查奇数并迭代到 num 的 sqrt 来优化代码

import math
def isPrime(num):
    if(num==1):
        return False
    if(num==2):
        return True
    if(num%2==0):
        return False

    i = 3
    while(i<math.sqrt(num)+1):
        if num%i==0:
            return False
        i += 2
    return True

#do the inputs and check if isPrime
#print(isPrime(2))

【讨论】:

    【解决方案2】:

    使用您的代码,并专注于代码结构:

    def is_prime(x):
        # function contents must be indented
        if x == 0:
            return False
        elif x == 1:
            return False
        # your base cases need to check X, not n, and move them out of the loop
        elif x == 2:
            return True
        for n in range(3, x-1):
            if x % n == 0:
                return False
        # only return true once you've checked ALL the numbers(for loop done)
        return True
    

    添加一些优化:

    def is_prime(x):
        if x <= 1:
            return False
        if x == 2:
            return True
        for n in range(3, x**(0.5)+1, 2):   # this skips even numbers and only checks up to sqrt(x)
            if x % n == 0:
                return False
        return True
    

    【讨论】:

      【解决方案3】:
      def prime(number):
          for i in range(2,number,1):
              if number % i == 0:
                  return False
      
          return True
      entry = int(input("Please enter the number: "))
      while True:
      if prime(entry):
              print ("It's a prime number. ")
              continue
          else:
              print ("It's not a prime number.. ")
              continue
      

      您将输入一个数字,然后此功能将告诉您它是否为质数。检查它会解决你的问题的功能。

      ALSO您可以升级程序的速度。你知道素数不可能是偶数,所以你不必检查偶数 比如 4-6-8-26。所以在范围函数中,即 (2,number) 添加“2” 结束它。像 (3,number,2) 那么程序不会检查偶数。

      ALSO 一个因子不能大于该数字的平方根。所以你不必检查所有号码,直到你的主号码,它 足以检查您的数字平方根。比如:(2,number**0.5) 那 表示从 2 到您的数字平方根。所以加倍计划 速度。

      所以函数将是:

      def prime(number):
          for i in range(3,(number**0.5)+1),2):
              if number % i == 0:
                 return False
          return True
      

      第一个函数其实对你来说已经足够了。我正在处理大量数字,因此我必须升级程序的速度。

      【讨论】:

      • 最好改成 (number**0.5) +1,否则像 49 这样的数字会被错误识别为素数,因为函数只会检查 3-6
      【解决方案4】:
      def is_prime(x):
        for n in range(2, x-1):
          if n == 0:
          return False
          elif n == 1:
              return False
          elif n == 2:
              return True
          elif x % n == 0:
              return False
          else:
              return True
      

      你做错的是,前三个 if elif 块每次都在循环中执行。因此,它们应该在 for 循环之外。还。

      if x%n==0:
        return True
      

      没关系。但后来

      else:
       return True
      

      是错误的,因为只要第一个 n 不除 x,它将返回 Composite。所以,

      return True 
      

      block 必须在 for 循环之外。 其他的优化可以自己做。

      【讨论】:

        【解决方案5】:

        我就是这样解决的

        def is_prime(n):
           if n==1:
             print("It's not a Prime number")
          for z in range(2,int(n/2)):
            if n%z==0:
              print("It's not a Prime number")
              break
        
          else:
            print("It's a prime number")
        

        或者如果你想返回一个布尔值

        def is_prime(n):
           if n==1:
             return False
          for z in range(2,int(n/2)):
            if n%z==0:
              return False
              break
        
          else:
            return True
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多