用C ++修复我对Eratosthenes筛选的实现

时间:2015-11-20 14:05:57

标签: c++ primes

我的算法正确运行到前100个素数,但出现问题。请看下面的代码,我试着按照这里给出的伪代码https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
  int n = 1000; //compute primes up to this number
  vector<bool> p(true,n); //all values set to true, from 0 to n

  for(int i = 2; i < sqrt(n)+1; i++){
    if( p[i-1] == true ){
      for(int j = i*i; j < n; j += i) //start looking for multiples of prime i at i*i (optimized)
    p[j-1] = false;
    }
  }

  for(int i = 2; i < n; i++){
    if( p[i-1] == true )
      cout << i << "\n";
  }
  return 0;
}

输出结果为:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
193
199

4 个答案:

答案 0 :(得分:4)

我对程序运行完全感到惊讶。它具有卡车 未定义的行为!。

除非我非常错误(在这种情况下请用周五投票奖励我周五下午的宁静),var text = "She is a very nice person"; var result = text.replace('She is', 'They are'); console.log(result); // They are a very nice person 正在创建一个大小为vector<bool> p(true, n)的向量,其元素初始化为{{ 1}}。

你的构造函数参数是错误的。对于大多数数值,这有效地逆转了筛子。

您是否完全破坏了编译器的警告级别?

答案 1 :(得分:1)

首先,您不需要为每个数字存储布尔值。这样,你就是在浪费记忆力。您应该只存储找到的素数,除非您有充分的理由不这样做。

我不会实现代码,因为它会破坏学习的乐趣。您应该实现以下内容:

  • p初始化为整数向量。
  • 将第2个值存储为p
  • 中的第一个值
  • 迭代从3开始到结束号
  • 的所有奇数
  • 对于每个数字,计算其平方根并将其存储到变量
  • 迭代p的所有先前元素,直到达到除数或给定索引处的向量值达到平方根,从第二个元素开始,因为忽略大于2的对数
  • 如果你在内循环中找到一个除数,将它存储到向量中并离开内循环

最后你会得到一个vector素数,指数将代表素数指数,而价值将是实际素数。每个元素都是它自己的主要元素。

答案 2 :(得分:0)

你搞砸了你的编号。如果p[k]是数字k+1的优先级,则您的for循环错误

for(int j = i*i; j < n; j += i)

应该是

for(int j = (i-1)*(i-1); j < n; j += (i-1))

我的建议是使用更具信息性的变量名称,并避免使用p[k]提供有关整数k+1的信息的混淆来源。

答案 3 :(得分:0)

您的矢量构造错误。一定是

vector<bool> p(n, true); //all values set to true, from 0 to n

而不是

vector<bool> p(true, n); //all values set to true, from 0 to n