首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这两种质数检查算法有什么不同?

这两种质数检查算法有什么不同?
EN

Stack Overflow用户
提问于 2021-01-22 01:57:16
回答 3查看 79关注 0票数 0

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

代码语言:javascript
复制
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是一个质数,显然不是,但是下面的代码似乎是有效的,我不知道有什么不同。

代码语言:javascript
复制
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))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-22 02:18:32

有很大的不同!

第一个错误!:

代码语言:javascript
复制
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条件变为false!

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

代码语言:javascript
复制
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的所有除数,但是在这个例子中,如果有一个数不是除数(我们检查了所有可能的除数),那么我们不会返回任何东西。因此,如果循环结束,没有找到除数,那么它就是质数!

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

下面是if_prime函数的一个适当而有效的版本:

代码语言:javascript
复制
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"
票数 1
EN

Stack Overflow用户

发布于 2021-01-22 02:26:09

在您的第一个示例中,

代码语言:javascript
复制
else:
    return f"{num} is prime"

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

在您的第二个示例中,

代码语言:javascript
复制
return f"{num} is prime"

仅当for循环运行完成且未找到要返回的非质数值时才执行

票数 0
EN

Stack Overflow用户

发布于 2021-01-22 02:36:58

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

代码语言:javascript
复制
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作为质数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65833150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档