素数代码错误10001的素数(python)

时间:2019-05-27 08:08:39

标签: python primes

我已经编写了一个查找素数的程序,但是当我尝试获得10001st素数时,这是不正确的。我不知道为什么。

我真的没有尝试太多,因为我不知道该怎么尝试。

import math
startingPrimes = [2,3, 5, 7, 11, 13, 17, 19]
for times in range (2):
    primeList = []
    numbersToBeTested = 0
    for _ in range (startingPrimes[len(startingPrimes)-1]**2):
        primeList.append(_ + 2)
    print ()
    numbersToBeTested = startingPrimes[len(startingPrimes)-1]**2
    print (numbersToBeTested)
    divisor = 0
    term = 0
    dividend = 0
    position = 0

    while divisor < math.sqrt(len(primeList)):
        term = 0
        divisor = startingPrimes[position]
        dividend = primeList[position]
        while term + 1 < len(primeList):

            term = term + 1
            if primeList[term] % divisor == 0:
                if primeList[term] != divisor:
                    primeList.remove(primeList[term])
        position = position + 1
    startingPrimes = primeList

for termOfList in range (len(primeList)):
    print (primeList[termOfList])
print ("How many primes: " + str(len(primeList)))
print ("10001st prime: " + str(primeList[10000]))

它给我90373,这是错误的! 请帮忙!

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题:

它会生成不是素数的素数,例如99973 = 257 * 389

要确定何时找到足够的素数几乎是不可能的。

它具有似乎毫无意义的奇怪表达,例如:

   for times in range (2):
       primeList = []

这似乎使代码运行两次!但这改变了结果!    代码注释在哪里!

有这个:

while divisor < math.sqrt(len(primeList)):

到目前为止,您发现的素数个数的平方根是搜索下一个素数的极限吗?

问题程序倾向于被覆盖或覆盖-这是一个被覆盖程序的示例。您可以使用十几行Python(每行不超过30个字符)在不到一秒钟的时间内解决此问题。您的程序需要的行数是前者的两倍以上,某些行的长度是后者的两倍,并且需要近一分钟的时间才能得出答案。

我的建议是重新开始并保持简单:

您不需要startingPrimes = [2,3, 5, 7, 11, 13, 17, 19]。只需初始化primeList = [2]就可以避免测试偶数并关注奇数除数。

您不需要math.sqrt(),只需测试if divisor * divisor > number:和所需除数是否在primeList中即可。

您真正需要对primeList进行的唯一修改操作是append()

应该在某个地方进行明确的完成测试,例如:

while len(primeList) < n:  # where n = 10001