我已经编写了一个查找素数的程序,但是当我尝试获得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,这是错误的! 请帮忙!
答案 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