【问题标题】:Sieve of Erathostenes.. find primes in range. How to get starting point?埃拉托色尼筛..找到范围内的素数。如何获得起点?
【发布时间】:2011-11-08 14:55:22
【问题描述】:

**注意:这与大学作业有关。我只是请求一些正确方向的指导。

我有一个单线程解决方案来查找素数(作业是转换为多线程解决方案)。它目前说从要检查的数字列表开始。从第一个素数 2 开始。(对于 0...N)。

我希望能够将列表 (0...N) 划分为 (0...25)、(26...50)、(51...75) 和 (76)。 ..100)。

如果每个列表的起点是第一个素数。我如何找到它?我必须有一个单独的函数来获得它吗?

谢谢。

【问题讨论】:

  • 您是否要为此添加多线程?
  • 是的,我正在尝试为此添加多线程。 [已编辑问题]。
  • 回答标题中的问题,o = 1 + 2*div a 2 是从ab 的奇数范围,q x = x*x - 2*x*min 0 (div (x*x-o) (2*x))x >= x*x 在范围内的第一个奇数倍数(在 Haskell 中)。取自stackoverflow.com/questions/12430495/…

标签: primes sieve-of-eratosthenes


【解决方案1】:

我认为您想要一个多线程实现。您不需要每个列表都以素数开头。 (考虑到您要计算的内容,这实际上有点循环。)想想一组工人,每个工人都有一个列表。与其让每个工人单独工作,不如考虑广播当前要筛选的素数,并让每个工人离开并将其应用到该工人的列表中。等到每个工人都报告完成了那个阶段,找到下一个素数,然后重复。

【讨论】:

  • 啊,好吧,所以一个线程将独自负责寻找素数。那么工人将负责过滤掉各自列表中的非素数?
  • 酷,我似乎有一个可行的解决方案。我可以在这里发帖进行更正吗?或者我不应该,因为这会直接解决同学们的问题。 [政策是什么?]
  • @Conor - 本身没有“政策”,但通常不鼓励直接发布家庭作业问题的答案。 “作业”标签的目的是提醒发帖者考虑这一点。另一方面,论坛的全部目的是获得并提供有关编程问题的帮助。也许您可以选择性地发布和穿线(俗话说)。
【解决方案2】:

要添加多线程,我只需使用一个变量来跟踪筛子的数量,然后启动一个线程来删除这些数字的倍数。

int a = 2;
//run thread 1
while(sieve[a] == false)
    a++;
//run thread 2
//etc.

显然还有更多内容。但这是一般的想法。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2011-04-25
    • 1970-01-01
    • 2011-12-16
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多