在Python中检查数字是否为素数
我已经编写了以下代码,应该检查输入的数字是否为素数,但有一个问题我无法解决:在Python中检查数字是否为素数,python,primes,Python,Primes,我已经编写了以下代码,应该检查输入的数字是否为素数,但有一个问题我无法解决: def main(): n = input("Please enter a number:") is_prime(n) def is_prime(a): x = True for i in (2, a): while x: if a%i == 0: x = False
def main():
n = input("Please enter a number:")
is_prime(n)
def is_prime(a):
x = True
for i in (2, a):
while x:
if a%i == 0:
x = False
else:
x = True
if x:
print("prime")
else:
print("not prime")
main()
如果输入的数字不是质数,它会显示“not prime”,正如它应该显示的那样,但如果数字是质数,它不会显示任何内容。你能帮我一下吗?如果
a
是素数,那么代码中的和x:
将永远运行,因为x
将保持为True
那为什么在那里呢
我想当你找到一个因子时,你想结束for循环,但不知道如何结束,所以你添加了它,因为它有一个条件。下面是您如何做到这一点:
def is_prime(a):
x = True
for i in range(2, a):
if a%i == 0:
x = False
break # ends the for loop
# no else block because it does nothing ...
if x:
print "prime"
else:
print "not prime"
有许多有效的方法可以测试素性(这不是其中之一),但您编写的循环可以用Python简洁地重写:
def is_prime(a):
return all(a % i for i in xrange(2, a))
也就是说,如果2到a(不包括)之间的所有数字在除以a时都给出非零余数,那么a就是素数。如果您只有少量查询,这是查看数字是否为素数的最有效方法。如果你问很多数字,如果它们是素数,试试看
导入数学
def是_prime(n):
如果n==2:
返回真值
如果n%2==0或n这是我对这个问题的看法:
from math import sqrt
from itertools import count, islice
def is_prime(n):
return n > 1 and all(n % i for i in islice(count(2), int(sqrt(n)-1)))
这是一个非常简单和简洁的算法,因此它并不意味着任何接近最快或最优化的素性检查算法。它的时间复杂度为O(sqrt(n))
前往了解有关正确完成的素性测试及其历史的更多信息
解释
我将给你们一些关于检查素数的几乎深奥的一行代码的内部信息:
- 首先,在Python2中使用
range()
确实是个坏主意,因为它将创建一个数字列表,这将占用大量内存。使用xrange()
更好,因为它创建了一个生成器,它只需要记住您提供的初始参数,并动态生成每个数字。如果你正在使用
默认情况下,Python 3,range()
已转换为生成器。顺便说一句,这仍然不是最好的解决方案:尝试为一些n
调用xrange(n)
,这样n>231-1
(这是长的最大值)会引发溢出错误。因此,创建范围生成器的最佳方法是使用itertools
:
xrange(2147483647+1) # OverflowError
from itertools import count, islice
count(1) # Count from 1 to infinity with step=+1
islice(count(1), 2147483648) # Count from 1 to 2^31 with step=+1
islice(count(1, 3), 2147483648) # Count from 1 to 3*2^31 with step=+3
- 如果要检查
n
是否为素数,实际上不需要一直到n
。您可以大大减少测试,只需检查2到√(n)
(n的平方根)。下面是一个例子:
让我们找出n=100的所有除数,并在表格中列出它们:
2x50=100
4x25=100
5x20=100
10 x 10=100注意:对于(2,a)中的i,它精确地运行循环两次:一次使用i==2,一次使用i==a。您可能希望对范围(2,a)中的i使用。
。请注意is_prime
为0和1返回True
。但是,Wikipedia被认为是“一个大于1的自然数,除了1和它本身之外没有任何正因子。”所以我将它改为返回a>1,并且所有(a%i代表xrange(2,a))中的i)
都不使用这个函数!原因如下。1) 如果a==1,则返回true,但1不被视为素数。2) 它检查一个数字在a-1之前是否为素数,但是一个优秀的程序员知道它只在sqrt(a)之前是必需的。3) 它不会跳过偶数:除了2,所有素数都是奇数。4) 它没有显示如何找到素数背后的算法思想,因为它使用Python的商品。5) Python3中不存在xrange,因此有些人将无法运行它。有些情况下会失败……我想在for循环中,结束限制应该是sqrt(n)+1,而不是sqrt(n)-1
xrange(2147483647+1) # OverflowError
from itertools import count, islice
count(1) # Count from 1 to infinity with step=+1
islice(count(1), 2147483648) # Count from 1 to 2^31 with step=+1
islice(count(1, 3), 2147483648) # Count from 1 to 3*2^31 with step=+3
for number in islice(count(10), 2):
print number,
# Will print: 10 11
for number in islice(count(1, 3), 10):
print number,
# Will print: 1 4 7 10 13 16 19 22 25 28
def all(iterable):
for element in iterable:
if not element:
return False
return True
from math import sqrt
from itertools import count, islice
def is_prime(n):
if n < 2:
return False
for number in islice(count(2), int(sqrt(n) - 1)):
if n % number == 0:
return False
return True