我的算法正确运行到前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
答案 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
初始化为整数向量。p
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