小编典典

Python素数检查器

python

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

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时给出的结果是:不是素数不是素数不是素数素数

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


阅读 219

收藏
2021-01-20

共1个答案

小编典典

一旦知道数字不是素数,就需要停止迭代。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))
2021-01-20