当前位置: 首页 > 知识库问答 >
问题:

为什么我的Eratostenes筛选算法失败了?

夏意蕴
2023-03-14

是的,我知道《埃拉托斯特尼筛》在标准的图书馆Prime类中,但我正在尝试实现自己的练习。

我正在逐字逐句地按照维基百科上的描述进行操作:

通过Eratosthenes的方法找到所有小于或等于给定整数n的素数:1.创建一个从2到n的连续整数列表:(2,3,4,…, n)。
2.最初,让p等于2,第一个素数。
3.从p开始,通过以p为增量计数到n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4p,…; p本身不应标记)。
4.在列表中找到第一个未标记的大于p的数字。如果没有这个数字,请停止。否则,让p现在等于这个新数字(它是下一个素数),并从步骤3重复。
5。当算法终止时,列表中所有未标记的数字都是素数。

def sieve(n)
    # Create a list of consecutive integers from 2 through n.   
    list = [*2..n] # [2, 3, 4, 5, etc]
    p = 2 # Let p equal 2, the first prime number

    # Starting from p, enumerate its multiples by counting to n in in increments of p
    loop do
        p1 = p # We'll use this to count in increments, by adding the initial value of p to p each iteration
        until p >= n 
            p += p1
            list.delete(p) # Mark all multiples of p in the list
        end
        if list.find{|x| x > p}
            p = list.find{|x| x > p} # p now equals the first number greater than p in the list that is not marked (deleted)
        else
            return list
        end
    end
end

筛(20)的输出是[2,3,5,7,9,11,13,15,17,19]

我不知道为什么。


共有1个答案

郜昊苍
2023-03-14

您正在更改p,因此它不是中的2list.find{|x|x

 类似资料:
  • 我试图解决Dijkstra算法上的一个hackerrank问题--https://www.hackerrank.com/challenges/dijkstrashortreach。我在使用我自己的Dijkstra代码逻辑。虽然我的代码解决了更容易的测试用例,但它在更高的测试用例上失败了。我猜我的代码在某个地方缺少了一些传递性,并且我得到的某个节点的值高于预期。你能帮我找出我的错误吗?问题:输入格式

  • 阿波罗查询是这样定义的: 我的架构: 我如何提出请求: UserLevelInput、RanksInput 和 PvpInput: 如果我在localhost:5005/graphql上进行这种变异,它将按预期工作: 此外,如果我提出请求(代码不在 /graphql),然后检查出Apollo开发工具的特定突变,我得到的Int,UserLevelIn的,RanksIn的和PpvIn的类型是未知的。A

  • 问题内容: 为什么我的代码不起作用? 结果是:0 1 2 3 4 5 6 7 8 9。 我期待一个 随机改组的序列 。 问题答案: 不能按预期应用于原始类型的数组。当应用于时,将产生的列表,而不是的列表。因此,您将重新整理一个新创建的列表。 这是Java中可变参数和泛型的微妙行为。被声明为 因此,它可以采用某些类型的多个参数并生成包含这些参数的列表,也可以采用一个类型的参数并返回此数组支持的列表(

  • 我正在使用Elasticsearch作为数据库。 我将使用聚合。 正如您在查询中看到的,有两个agg-rule 1和Rule2。 Rule2正在使用过滤器aggs,而Rule1没有使用。 当我要使用流水线时,逻辑1是好的,但逻辑2失败了。 这是错误消息。 我不确定出了什么问题。 如果有过滤器,是否无法使用管道累积? 我向那些对Elasticsearch有丰富经验的人寻求帮助。 谢谢你的帮助。

  • 这个小小的HTML5密码字段在没有on无效属性的情况下工作得非常好(模式是:至少6个字符): 请看这里的jsFiddle。 但是,当我添加一个oninvalid属性,当用户的输入不符合模式时,该属性会发出一条自定义错误消息,整个字段将永远无效,请参见此处的代码: 请看这里的jsFiddle。 你能找出错误吗?

  • 有没有一个简单的pari/gp程序可以筛选k*n c(其中n和c是固定的)形式的数,直到某个素数p,并且k被限制在某个范围内(即k=1,10000,) 伪代码: 换句话说,从整数列表 T 开始 检验素数范围 p 中的第一个素数,并从列表 T 中删除整数 k,使得 k*n c 可以被 p 整除。然后测试下一个素数,依此类推。执行此操作,直到达到筛子返回的极限,或打印候选列表。感谢您的帮助!