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

2024-06-07 03:10:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经做了一个程序来寻找素数,但当我试图得到第10001素数它是不正确的。我不明白为什么

我真的没怎么试过,因为我不知道该试什么

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,这是错误的! 请帮帮我


Tags: inforlenpositionrangemath素数divisor
1条回答
网友
1楼 · 发布于 2024-06-07 03:10:45

您的代码有许多问题:

它生成的素数不是素数,例如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

相关问题 更多 >