首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >素数检查器

素数检查器
EN

Stack Overflow用户
提问于 2013-10-15 23:27:47
回答 3查看 9.4K关注 0票数 0

嗨,我在做一个函数,检查一个数字是否是质数,但它告诉我9是质数。

代码语言:javascript
复制
def eprimo(num):
    if num < 2:
        return False
    if num == 2:
        return True
    else:
        for div in range(2,num):
            if num % div == 0:
                return False
            else:
                return True
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-15 23:31:12

无论是否完成检查,您都将从该for循环的第一次迭代中返回。除非数字绝对不是质数,否则不应该从循环内部返回。删除else,并且仅在循环结束时返回True

代码语言:javascript
复制
def eprimo(num):
    if num < 2:
        return False
    if num == 2:
        return True
    else:
        for div in range(2,num):
            if num % div == 0:
                return False
        return True

优化旁注:你真的不需要检查所有的候选除数,直到num。你只需要检查num的平方根。

票数 2
EN

Stack Overflow用户

发布于 2013-10-15 23:31:19

for循环检查您的数字是否能被2整除时,它会在第一次迭代后立即退出。如果您的数字是偶数,它将返回False;否则,它将返回True

解决方案不是立即返回True;而是等待循环中所有迭代的结束:

代码语言:javascript
复制
for div in range(2, num):
    if num % div == 0:
        return False
return True

或者,使用all()结构:

代码语言:javascript
复制
return all(num % div != 0 for div in range(2, num))
票数 6
EN

Stack Overflow用户

发布于 2013-10-15 23:49:14

您可以提取偶数的测试,然后只对奇数进行循环,而不是测试范围(2,num)中的所有除数。此外,正如蜥蜴比尔所建议的那样,你可以在num的平方根上停止。这将是两倍的速度:

代码语言:javascript
复制
def eprimo(num):
    if num < 2:
        return False
    if num % 2 == 0:
        return num == 2
    div = 3
    while div * div <= num:
        if num % div == 0:
            return False
        div += 2
    return True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19385136

复制
相关文章

相似问题

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