我写了一个简单的程序来生成素数。素数印得很好。我还试图将每个素数放在一个向量中以便进一步处理,但不知何故,数字似乎进入(即push_back)向量,因为它打印出奇数而不是素数。简而言之,整个程序工作正常,只有向量有问题。请帮忙。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
const int NUM = 300;
int main()
{
int i, j ;
int counter = 0;
bool arr[NUM] = {false}; //false == 0
vector<int> aVector;
...
cout << "\nNumber of prime numbers is " << counter << endl;
for (j=0; j<aVector.size() ; j++)
{
cout << "aVector[" << j << "] is " << aVector[j] << endl;
}
return 0;
}
答案 0 :(得分:6)
您的代码访问超出arr
的范围。数组在C ++中是零索引的。
for (i = 2; i<=NUM; i++)
应该是:for (i = 2; i<NUM; i++)
for (j = 1; j <= NUM/i; j++)
应该是:for (j = 1; j * i < NUM; j++)
应用这些修补程序后,您的代码为appears to work for me。我删除了if (i
支票,因为它是多余的。
答案 1 :(得分:3)
正如M.M指出的那样,在代码中的许多地方,您试图从arr
数组的边界之外获取和设置值。这是C ++中未定义的行为。一旦调用未定义的行为可能发生任何 - 整个程序(不仅包含错误的行)的行为是不可预测的。在静态数组边界外写入通常会导致覆盖其他变量。
看起来您的程序会覆盖aVector
的内部数据,将其指针替换为动态分配的数组。难怪它打印“随机垃圾” - 矢量现在认为它的内容位于内存中的不同位置。
根据经验:Simple C [] arrays are evil,请改用矢量:
vector<bool> arr(NUM, false)
。要访问元素,请使用:arr.at(some_index)
。如果some_index
超出向量边界,则会抛出异常。请注意,即使您使用向量,arr[some_index]
也不会执行边界检查,因此也会导致未定义的行为。
答案 2 :(得分:2)
这是一个简单的快速修复。循环到向量的末尾。
for (j=0; j<aVector.size() && j < 6; j++){
cout << "aVector[" << j << "] is " << aVector[j] << endl;
}
------------------------我试过的完整代码
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
#define NUM 100
int main()
{
int i, j ;
int counter = 0;
bool arr[NUM] = {false}; //false == 1
vector<int> aVector;
for (i = 2; i<=NUM; i++)
{
if (arr[i] == 0)
{
cout << setw(6) << i ; //i is a prime number
/****doesn't seem to work****/
aVector.push_back(i); //fill the vector with prime numbers
counter++;
if (i <= NUM/2)
{
for (j = 1; j <= NUM/i; j++)
{
arr[i*j] = 1;
}
}
}
}
cout << "\nNumber of prime numbers is " << counter << endl;
/*** it prints out strange numbers ******/
for (j=0; j<aVector.size() && j < 6 ; j++){
cout << "aVector[" << j << "] is " << aVector.at(j) << endl;
}
return 0;
}