【问题标题】:Python - function returns true when a given number is a prime number or else falsePython - 当给定数字是素数时,函数返回true,否则返回false
【发布时间】:2020-06-04 12:11:57
【问题描述】:

您好,我是初学者,我被困在这个问题上,希望我只使用 while 循环来解决。这个问题要我写一个函数,当给定的数字是素数时返回 True,如果给定的数字不是素数,它返回 False。

到目前为止我的代码:

def is_prime(n):
    i = 2
    while i <= n//2:
        if n%i != 0:
            return True
        else:
            return False
        i+=1

我遇到的问题是我认为我的代码显示了数字 4 及以上的正确输出,它返回 1、2 和 3 的“无”。我已经调试过它,我认为问题是 while 循环条件.但我不知道如何解决它。如果有任何专业人士可以帮助我,我将不胜感激!

编辑: 我更改了 while 条件,但 1 仍然返回 None .. 并且 2 在应该返回 True 时返回 False

def is_prime(n):
    i = 2
    while i <= n:
        if n%i != 0:
            return True
        else:
            return False
        i+=1

【问题讨论】:

  • 对于 while 循环,因为:i &lt;= n//23//2 = 1
  • 如何在使其余代码正常工作的同时修复它?
  • 只需在while循环之前为n == 1、2或3添加一些简单的条件,并相应地返回。
  • 首先,您只需上到sqrt(n)。其次,在 3 之后,您可以增加 2,因为偶数永远不是质数。对于 1,它被定义为素数,所以把那个测试放进去。对于 2 和 3,有while i &lt; max(math.sqrt(n),2):
  • 您必须先让while 循环完成,然后才能返回True;一旦您测试了第一个除数,您就会返回。当i除以n时,可以立即返回False;否则,您必须继续使用 i 的下一个值。如果循环真正完成,那么你可以返回True

标签: python


【解决方案1】:
import math;
def is_prime(n):
    i = 2
    while i < max(math.sqrt(n),2):
        if n%i != 0:
            return True
        else:
            return False
        if i == 2:
            i+=1
        else
            i+=2

【讨论】:

  • 在没有 import math 和 max(math.sqrt(n),2) 的情况下还有其他方法吗?我的工作簿还没有教我这些...
  • 如果你的老师因为你使用了你还没有学过的东西而惩罚你,那么你找错了老师。但是,是的...有一个 while 循环递增 iMax 直到 iMax*iMax&gt;=n
  • 其实可以iMax = 2开头。
【解决方案2】:

如果你不想使用sqrt,你可以硬编码这三种情况:

def is_prime(n):
    i = 2

    if n in (1,3):
        return True
    elif n == 2:
        return False

    while i <= n//2:
        if n%i != 0:
            return True
        else:
            return False
        i+=1

for x in range(1, 5):
    print(x, '=', is_prime(x))

输出:

(1, '=', True)
(2, '=', False)
(3, '=', True)
(4, '=', False)

【讨论】:

    【解决方案3】:

    想要变得非常花哨吗?做一个埃拉托色尼筛子:

    def is_prime(n):
        a = list()
        # Assume all are prime
        a[0:n+1] = (n+1)*[1]
    
        # Start with removing even numbers
        i = 2
        while i*i <= n:
            print ("I: ", i)
            # Set all divisible by i to 0
            a[0:n+1:i] = len(a[0:n+1:i])*[0]
    
            # If a[n] is zero, return False
            if a[n] == 0:
                return False
    
            # Increment i until we have a prime number
            while a[i] == 0:
                i+=1
    
        if a[n] == 0:
            return False
        else:
            return True
    

    【讨论】:

      【解决方案4】:

      如果你想给你的课老师留下深刻印象,你可以向他展示一个快速的概率素数 isprime for numbers 大于 2**50。在 6 核 AMD 上进行了数周的 cpu 时间压力测试后,我没有发现任何错误:

      import random
      import math
      
      def lars_last_modulus_powers_of_two(hm):
         return math.gcd(hm, 1<<hm.bit_length())
      
      def fast_probabilistic_isprime(hm):
          if hm < 2**50:
             return "This is to only be used on numbers greater than 2**50"
          if lars_last_modulus_powers_of_two(hm+hm) != 2:
             return False
          if pow(2, hm-1, hm) == 1:
             return True
          else:
             return False
      
      def fast_probabilistic_next_prime(hm):
         if hm < 2**50:
             return "This is to only be used on numbers greater than 2**50"
         if hm % 2 == 0:
            hm = hm + 1
         hm += 2
         while fast_probabilistic_isprime(hm) == False:
            hm += 2
         return hm
      
      """ hm here is bitlength, which must be larger than 50.
          usage is create_probabilistic_prime(1000)
      """
      def create_probabilistic_prime(hm):
         if 2**hm < 2**50:
             return "This is to only be used on numbers greater than 2**50"
         num = random.randint(2**hm,2**(hm+1))
         return fast_probabilistic_next_prime(num)
      

      【讨论】:

      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多