有人可以查看我的代码以创建Eratosthenes筛子吗?

时间:2018-09-16 13:30:21

标签: python-3.x

我一直在努力解决Euler项目中的问题,并且到达了问题7,它要求给出第10001个素数。目前,我正在使用Python 3。

突然冒出的是生成Eratosthenes筛并将其值存储在列表中。从那里开始,剩下的就是历史了,我打印第10001个素数,然后继续。

那是我试图做的,但失败了。我不太确定哪里出了问题,我想知道为什么我的代码没有提供正确的答案?显然,我创建的不是Eratosthenes的合法筛网,但我想知道为什么它无法按我的预期运行。如果有人要纠正我,我会很清楚,因为我是编码的新手。我会尽力解释我的想法。

首先,我创建了一个空列表,并创建了一个for循环,如下所示,以向其添加数字,其中没有2、3、5或7作为因子。我不必担心4、6、8或9,因为它们无论如何都是2或3的倍数。

sieveLayer1 = []
import math

for i in range(0,50000):
   if ((i % 2 != 0 and i % 3 != 0) and (i % 5 != 0 and i % 7 != 0)):
       sieveLayer1.append(i)
print(sieveLayer1)

分析了此处创建的内容后,我认为列表中剩下的唯一非质数是平方数,因此我使用了数学模块中的sqrt方法来过滤它们,如下所示:

for j in sieveLayer1:
    if (math.sqrt(j)).is_integer():
        sieveLayer1.remove(j)

如果上面迭代的任何值的平方根是整数,则表明该值不是素数,因此我将其从列表中删除。

在过滤掉数字2,3,5,7之前,我只是创建了一个新列表,列出了我认为需要的所有素数:

primeList = [2,3,5,7] + sieveLayer1

从这里开始,我认为print(primeList [10000])会给我我想要的东西,但是失败了。它给了我43943。我知道我的最终答案应该是104743。我知道它不在我原来的for循环范围内,但是如果我的Sieve是正确的,那表明我的数字不是10001st,我只需调整范围即可。 就像我说的那样,我希望看到我的代码出了什么问题以及为什么我离正确的数字如此之遥。

0 个答案:

没有答案