【问题标题】:Whats the difference between those two prime number checking algorithms这两种质数检查算法有什么区别
【发布时间】:2021-01-21 17:57:16
【问题描述】:

所以最近我一直在尝试找出应该检查数字是否为素数的算法。于是我想出了一个主意,让代码看起来像这样:

def if_prime(num):
   
    for divisor in range(2,num):
        if (num % divisor) == 0:
            return f"{num} is not prime"
        else:
            return f"{num} is prime"
print(if_prime(9))

所以基本上这段代码返回了错误的值,它说 9 是质数,显然不是,但是下面的代码似乎可以工作,我不知道有什么区别。

def if_prime(num):
    for divisor in range(2,num):
        if (num % divisor) == 0:
            return f"{num} is not prime"                                      
    return f"{num} is prime"

print(if_prime(9))

【问题讨论】:

  • 第一个从不查看除 2 以外的除数;它返回一个字符串是否num % 2 == 0

标签: python primes


【解决方案1】:

差别很大!

第一个错了!:

def if_prime(num):
   
    for divisor in range(2,num):
        if (num % divisor) == 0:
            return f"{num} is not prime"
        else:
            return f"{num} is prime"

这会检查一个数字是否有任何介于 0 和 num 之间的因数,如果找到一个因数,则返回该数不是素数。

但错误在于,如果它没有找到一个因子,那么它会立即返回 true,并且不会检查其他除数:

例如这将说 9 是一个素数,它不能被 2 整除并且 if 条件变为假!

另一方面,第二个是正确的! :

def if_prime(num):
    for divisor in range(2,num):
        if (num % divisor) == 0:
            return f"{num} is not prime"                                      
    return f"{num} is prime"

在这一个中,我们也循环遍历从 2 到 num 的所有除数,但在这种情况下,如果一个数字不是除数,我们不返回任何内容(我们检查所有可能的除数)因此如果循环结束并且我们找到没有除数则表示它是质数!

但这也有一个小错误,因为它会说 1 是质数!

下面是 if_prime 函数的一个适当且高效的版本:

def if_prime(num):
    for divisor in range(2, num/2):
        if (num % divisor) == 0:
            return f"{num} is not prime"                                      
    if num == 1:
        return f"{num} is not prime"
    else:
        return f"{num} is prime"

【讨论】:

    【解决方案2】:

    在您的第一个示例中,

    else:
        return f"{num} is prime"
    

    在第一次迭代后中断你的 for 循环,因为 return 停止你的循环并从方法中返回值

    在您的第二个示例中,

    return f"{num} is prime"
    

    仅在 for 循环运行完成而没有找到要返回的非质数时执行

    【讨论】:

      【解决方案3】:

      你的第一个函数的问题是,如果 num 不能被 2 整除,它会返回误报。如果 num 不能被 2 整除,你需要继续前进。这已在您的第二个函数中得到纠正。

      def if_prime(num):
          for divisor in range(2, num):
              if (num % divisor) == 0:
                  return f"{num} is not prime"
          return f"{num} is prime"
      

      这里,执行 else 语句的唯一方法是当 if 语句不返回任何内容时。这只是意味着您没有找到从 2 到 num 的除数。所以它必须意味着 num 是素数。因此它返回 num 作为素数。

      【讨论】:

        猜你喜欢
        • 2013-09-08
        • 2019-03-31
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多