我试图使用矢量
编写Eratosthenes算法1) Fill vector with integers 2 to N
2) Find the smallest integer i, print it, delete i, 2i, 3i, etc from vector
3) Repeat 2) until i is greater than square root of N
我对矢量很新,并且有点困在这里:
std::vector<int> x (n-1);
for (int i = 2; i < n+1; i++){ //fill vector with 2 to N
x[i-2] = i;
}
float nsq = sqrt(n);
//iterate from 2 to sqrt(n):
for (std::vector<int>::iterator current = x.begin(); *current < nsq; current++){
//access positions 0,2,4,6,8 etc in first iteration, 0,3,6,9 in next, etc
for (int position = current - x.begin(); position <= x.end(); position += *current){
//print x[position] only in first loop
//delete x[position]
}
}
两个问题:
1)position&lt; = x.end();返回错误,我无法使用&#39; auto&#39;因为我不使用c ++ 11,虽然我不确定是否可以使用c ++ 11。解决这个问题的最佳方法是什么?
2)有没有办法在循环开始时只打印一次数字?或者我没有使用这种算法正确的方向/过度复杂吗?
编辑:刚刚意识到我确实过度复杂了,也谢谢你的回答。这是一个可接受的算法吗?
for (std::vector<int>::iterator current = x.begin(); *current < nsq; current++){
for (int position = 0; position <= x.size(); position += *current){
if(position == 0){
std::cout << x[position] << std::endl;
}
//delete x[position]
}
}
答案 0 :(得分:1)
1)position&lt; = x.end();返回错误,我无法使用&#39; auto&#39;因为我不使用c ++ 11,虽然我不确定是否可以使用c ++ 11。解决这个问题的最佳方法是什么?
迭代器没有意识到他们在他们正在迭代的容器中的位置。在最基本的层面上,迭代器只是一个可以智能移动的指针;在std::vector
的情况下,它实际上只是指针的包装。
在此代码中,您要检查索引是否小于或等于指针;你比较了两件完全不同的东西,这些都没有多大意义。
如果你想知道迭代器在向量中的位置,最好转储迭代器并只使用索引,而不是试图混合两者。
2)有没有办法在循环开始时只打印一次数字?或者我没有使用这种算法正确的方向/过度复杂吗?
您可以检查position
是否等于您在第一次迭代时的预期,如果匹配,则打印该数字。
答案 1 :(得分:0)
一旦您将数字识别为素数,您的意图是从矢量中删除其所有倍数。好的,这是可能的。但是你不能仅仅推断5的所有倍数(例如)在向量中相差5个位置,因为你已经删除了2和3的倍数,其中一些也是5的倍数。实施明智@ amchacon的建议将更加容易。