Eratosthenes的筛子与范围

时间:2015-04-05 11:23:35

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

我正在尝试在C ++中生成从N到N_Max的素数序列。我的方法是使用Sieve of Eratosthenes生成这些素数:

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来浪费内存。是否有一个运行速度更快,占用更少内存的函数?

1 个答案:

答案 0 :(得分:1)

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

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

抛开:不是使用浮点来计算平方根(即sqrt()),而是有简单的算法来计算“整数平方根”(即给定值M,找到值R,这是R*R <= M)的最大整数。使用您最喜爱的搜索引擎轻松找到。优点是它可以让你远离浮点的细微差别,并且必须转换回整数。