首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >埃拉托斯提尼环的筛子不正确拉元件

埃拉托斯提尼环的筛子不正确拉元件
EN

Stack Overflow用户
提问于 2015-10-08 19:02:41
回答 2查看 61关注 0票数 0

我使用的是Eratosthenes算法,该算法涉及从列表中提取第一个元素,将其添加到素数列表中,然后从原始列表中提取该数字的任何倍数(从2开始,追加2,删除2的所有倍数)。然后转到下一个号码。

我的循环(在2-10的列表上运行)执行它第一次应该做的事情,但是下一次没有拉动3,而是直接跳转到5,剩下的是2、5和9的列表。

代码语言:javascript
运行
复制
list_before_primes = [num for num in range(2, usr_in + 1)]
print(list_before_primes)
list_o_primes = []

for element in list_before_primes:
    list_o_primes.append(element)
    for sub_element in list_before_primes:
            if sub_element % element == 0:
                list_before_primes.remove(sub_element)

print(list_o_primes)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-08 19:23:16

由于您在循环中修改了list_before_primes,所以不应该使用for element in list_before_primes: (正如@Kevin所指出的)。

您可以使用while list_before_primes:代替,并将第一项弹出到element中。

这也将解决@Kashyap注释(因为元素将从列表中删除)。

顺便说一句,您可以使用list_before_primes = [num for num in range(2, usr_in + 1)]简化list_before_primes = list(range(2, usr_in + 1))

票数 2
EN

Stack Overflow用户

发布于 2015-10-08 19:26:33

以下是该算法的实现:

代码语言:javascript
运行
复制
def sieve_of_eratosthenes(usr_in):
    #you don't need list comprehension in your implementation. You can do this:
    list_before_primes = range(2, usr_in + 1)
    print(list_before_primes)

    #makes a set of list_before_primes
    #funny things can happen when you modify and iterate over the list at the same time. 
    #it is better to make a copy and remove from it.
    list_o_primes = set(list_before_primes)

    for i,element in enumerate(list_before_primes):
        for sub_element in list_before_primes[i+1:]:
            if sub_element % element == 0:
                if sub_element in list_o_primes:
                    list_o_primes.remove(sub_element)

    print(list_o_primes)

if __name__ == '__main__':
    sieve_of_eratosthenes(10)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33023931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档