使用 Sundaram 筛法在给定范围内生成素数的 C++ 程序

c++server side programmingprogramming

这是实现 Sundaram 筛法在给定范围内生成素数的 C++ 程序。该算法由 Sundaram 于 1934 年发现。

算法

开始
    printPrimes(n)
    在这里我们找出小于 n 的素数
    我们将 n-2 减半。我们称之为 New。
    New = (n-2)/2;
    创建一个数组 marked[n],用于将形式为 i+j+2ij 的数字与
    其他数字分开,其中 1 <= i <= j
    将 marked[] 的所有条目初始化为 false。
    将所有形式为 i + j + 2ij 的数字标记为 true
    其中 1 <= i <= j
    对于 i=1 到 New
        a) j = i;
        b) 循环 While (i + j + 2*i*j) 2,然后打印 2 作为第一个素数。
        其余素数的形式为 2i + 1,其中 i 是
        未标记数字的索引。因此,对于所有 i
        打印 2i + 1,使得 marked[i] 为假。
结束

示例代码

#include <bits/stdc++.h>
using namespace std;
int SieveOfSundaram(int m) {
   int N= (m-2)/2;
   bool marked[N + 1];
   memset(marked, false, sizeof(marked));
   for (int i=1; i<=N; i++)
      for (int j=i; (i + j + 2*i*j) <= N; j++)
         marked[i + j + 2*i*j] = true;
      if (m > 2)
         cout << 2 << " ";
   for (int i=1; i<=N; i++)
      if (marked[i] == false)
         cout << 2*i + 1 << " ";
}
int main(void) {
   int m = 10;
   SieveOfSundaram(m);
   return 0;
}

输出

2 3 5 7

相关文章