Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中检查数字是否为素数_Python_Primes - Fatal编程技术网

在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