Python素数检查器[重复]

发布于 2021-01-29 15:04:14

这个问题已经在这里有了答案

如何创建最紧凑的映射n→isprime(n)直到极限N? (31个答案)

5年前关闭。

我一直在尝试编写一个将输入数字的程序,并检查它是否是质数。如果数字实际上是质数,那么到目前为止,我编写的代码可以完美地工作。如果该数字不是质数,则它的行为很奇怪。我想知道是否有人可以告诉我代码的问题所在。

a=2
num=13
while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    a=a+1
  else:
    print('prime')
    a=(num)+1

输入24时给出的结果是:不是素数不是素数不是素数素数

我将如何在每个奇数而不是每个偶数的素数上报告报告素数来修复错误

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    一旦知道数字不是素数,就需要停止迭代。break一旦找到质数就添加一个,退出while循环。

    只需对代码进行最少的更改即可使其工作:

    a=2
    num=13
    while num > a :
      if num%a==0 & a!=num:
        print('not prime')
        break
      i += 1
    else: # loop not exited via break
      print('prime')
    

    您的算法等效于:

    for a in range(a, num):
        if a % num == 0:
            print('not prime')
            break
    else: # loop not exited via break
        print('prime')
    

    如果将其放入函数中,则可以免除breakfor-else:

    def is_prime(n):
        for i in range(3, n):
            if n % i == 0:
                return False
        return True
    

    即使您要像这样强力求素,也只需要迭代到的平方根即可n。另外,您可以跳过测试两个之后的偶数。

    这些建议如下:

    import math
    def is_prime(n):
        if n % 2 == 0 and n > 2: 
            return False
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
        return True
    

    请注意,此代码不能正确处理01和负数。

    我们通过all与生成器表达式一起使用来替换for循环,从而使此过程更简单。

    import math
    def is_prime(n):
        if n % 2 == 0 and n > 2: 
            return False
        return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看