我知道它已被多次讨论过;我读过它,但不知怎的,我无法得到它。 我想编写一个程序来确定输入的数字是否为素数。
我在互联网上找到的其中一个实现:
from math import *
def main():
n = abs(input("Enter a number: "))
i = 2
msg = 'is a prime number.'
while i <= sqrt(n):
if n % i == 0:
msg = 'is not a prime number.'
i = i + 1
print n, msg
main()
这里有几个问题:
i
是什么,为什么它的起始值为2
?i = i + 1
在此计划中做了什么?'is a prime number.'
即使它不在身体循环中? 答案 0 :(得分:4)
素数是一个只能被1整除的数字。它使用的方法是尝试将候选人编号n
除以2之间的每个其他数字;但是,如果任何数字i
是您的数字n
的除数,那么n / i
也是如此,并且其中至少有一个小于或等于sqrt(n)
因此我们只需要测试最高为sqrt(n)
。在实践中,我们只需要测试实际为素数的除数,但由于我们没有一个素数列表,我们将测试每一个。
上面的
i
是什么?为什么它有2个起始值?
i
是我们正在测试n
的潜在因素。它从2开始,因为我们不关心1是否将n
除以(并且很简单),因为主要定义允许/期望。
在这个具体的例子中,i = i + 1语句是什么?无法在程序中看到它的使用。
它在i
定义的循环结束时递增while i <= sqrt(n)
值;这意味着我们提前i
来测试n
的下一个候选除数。
最后,python如何知道何时打印'是素数。'虽然它不在身体循环中?
我们将msg
初始化为“是一个素数”,如果我们找到任何除数,那么我们将它改为循环内的“不是素数”。如果循环没有找到除数,或者循环从不运行,我们将使用我们设置的初始值,即“是素数”。顺便说一句,当你找到一个除数时,你可以break
离开循环;之后没有必要进行测试。
另外,您可能希望在while和store之外计算sqrt(n)
而不是在while
中使用的变量 - 您可能会重新计算每次迭代的平方根,这相对较贵
答案 1 :(得分:1)
我在各方面添加了评论来解释每一行的作用:
from math import * # imports everything from the math module
def main():
n = abs(input("Enter a number: ")) # gets input from the user
i = 2 # starts off at 2 because all input is divisble by 1
msg = 'is a prime number.' # the message is initially set
while i <= sqrt(n):
if n % i == 0: # if 'i' divides evenly into n
msg = 'is not a prime number.' # only set if it isn't a prime
i = i + 1 # increases 'i' by 1 so it can check every value up to the square-root of 'n' (to see if it divides evenly)
print n, msg
main()
程序必须遍历i
的每个值(最多为n
的平方根),以便检查每个可能的因素。
这是一种粗略的素数检查器,对于不是素数的大数字效率低:
如果输入是1234567890
之类的数字,它将遍历每个数字,直到该数字的平方根,即35147
(向上舍入)。
使用return
语句会中断循环,因此您检查的第一个数字2
,它被声明为非素数,因为它可以被2
整除。
通过使用return
,它将停止该功能,并为您节省35,146次计算。这不是一个庞大的数字(至少对于计算机来说),但它的内存效率更高,耗时更短。
def isPrime(n):
'''Checks if 'n' is prime.'''
from math import sqrt
if n == 0 or n == 1:
return False
else:
for check in range(2, int(sqrt(n))+1):
if n % check == 0: return False
return True