【问题标题】:Sieve of Eratosthenes Given with Range埃拉托色尼筛分给定范围
【发布时间】:2023-03-18 07:55:01
【问题描述】:

我正在尝试在 C++ 中生成从 N 到 N_Max 的素数序列。我的方法是使用埃拉托色尼筛法来生成这些素数:

void runEratosthenesSieve(int upperBound) {
      int upperBoundSquareRoot = (int)sqrt((double)upperBound);
      bool *isComposite = new bool[upperBound + 1];
      memset(isComposite, 0, sizeof(bool) * (upperBound + 1));
      for (int m = 2; m <= upperBoundSquareRoot; m++) {
            if (!isComposite[m]) {
                  cout << m << " ";
                  for (int k = m * m; k <= upperBound; k += m)
                        isComposite[k] = true;
            }
      }
      for (int m = upperBoundSquareRoot; m <= upperBound; m++)
            if (!isComposite[m])
                  cout << m << " ";
      delete [] isComposite;
}

但是这个函数通过计算素数 1 到 N 会浪费内存。有没有一个函数会运行得更快并且占用更少的内存?

【问题讨论】:

  • 你可能会喜欢我对this question 的回复,它只生成给定范围内的素数。
  • 它在 phyton 中,我会尝试翻译,但谢谢!
  • 其实不是Python,而是一种伪代码。

标签: c++ primes sieve-of-eratosthenes


【解决方案1】:

您需要做的就是确定高达sqrt(N_max) 的值是素数还是合数 - 正如您已经在做的那样。然后从 N 循环到 N_max 并确定每个值是否可以被找到的素数整除(在2sqrt(N_max) 之间)。

这只是对您的方法的微小调整。

顺便说一句:不是使用浮点来计算平方根(即sqrt()),而是有一些简单的算法来计算“整数平方根”(即给定一个值M,找到值R这是最大的整数,如R*R &lt;= M)。使用您最喜欢的搜索引擎轻松找到。优点是它可以让您摆脱浮点数的细微差别,并且必须转换回整数。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多