0

今天之前,我问了一个关于使用 2D 数组实现 Eratosthenes 筛的问题,并被一些人告知使用向量来代替。唯一的问题是我不知道如何在 C++ 中使用向量。

我今天使用向量而不是二维数组重写了我的程序,并且运行良好,直到程序快结束时,我收到以下错误:

sieve.h:在函数 'void printPrimes(std::vector*, int)' 中:sieve.h:42:20: 错误:在 'std::cout << *(primes + ((unsigned int)(((unsigned int)i) * 12u)))'</p>

我以前从未收到过这种错误消息,所以我不确定如何解决这个问题。

这是我修改后的代码:

筛子.h

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <vector>
using namespace std;

vector<int> calc_primes(int);
void printPrimes(int[]);

vector<int> calc_primes(int max)
{
    vector<int> primes;

    for(int i = 2; i < max; i++)
    {
        primes.push_back(i);
    }

    // for each value in the vector
    for(int i = 0; i < primes.size(); i++)
    {
        //get the value
        int v = primes[i];

        if (v!=0) {
            //remove all multiples of the value
            int x = i+v;
            while(x < primes.size()) {
                primes[x]=0;
                x = x+v;
            }
        }
    }
    return primes;
}

void printPrimes(vector<int>* primes, int size)
{
int primearray[size];
for(int i = 0; i < size; i++)
    {
        cout<<primes[i]<<endl;
    }
}

筛子.cpp

#include "sieve.h"
using namespace std;

int main()
{
    int max;
    cout<<"Please enter the max amount of prime numbers:"<<endl;
    cin>>max;
    vector<int> primes = calc_primes(max);
    printPrimes(primes, max);
    return 0;
}
4

2 回答 2

2

您的循环如下所示:

for(int i = 0; i < size; i++)
{
    cout<<primes[i]<<endl;
}

但是由于 primes 是指向向量的指针,因此将素数视为向量数组,并且通过使用 primes[i] 您正在访问向量数组中的第 i 个向量,而您的本意是访问第 i 个元素传递给函数的单个向量。

要修复它,只需更改以下内容:

void printPrimes(vector<int>* primes, int size)

对此

void printPrimes(const vector<int> & primes, int size)

现在您说素数是对向量的引用,primes[i]然后是该向量的第 i 个元素。

于 2013-09-25T02:08:20.390 回答
0
void printPrimes(vector<int>* primes, int size)
{
int primearray[size];
for(int i = 0; i < size; i++)
    {
        cout<<(*primes)[i]<<endl;
    }
}

primes是一个指针,但是,您想在向量中打印该值。* primes是primes指向的向量,所以解是 *( primes)[i]

于 2013-09-25T02:21:46.770 回答