1

今天,我尝试对 Eratosthenes 筛进行编程,只要它为我提供质数,它就可以工作。但是我不明白的动态数组有问题。

第一个问题:一旦我尝试为 n 输入一个“大”值(例如 120),程序就会崩溃,它甚至不会分配内存。

第二个问题:如果我输入一个像 50 这样的值,它能够给出正确的素数,但在删除数组之前会崩溃。

第三个问题:如果我输入一个非常小的值,比如 5 它能够执行整个程序,它会给出正确的数字并删除内存。

但我不明白为什么它的行为如此不同。120 个布尔值不会让我的记忆崩溃,至少我是这么认为的。为什么它不能删除一个包含 50 个值的数组,但实际上能够删除一个包含 5 个值的数组?谁能告诉我有什么问题?

int n;
cin >> n;
n=n+1;
bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    for(;j<n;j+=i)
        feld[j]=true;
}
for(int i=2;i<n;i++)
    if(!feld[i])
        cout << i << endl;
    else;
delete[] feld;
feld = NULL;
4

3 回答 3

6

你的问题在这里:

int j=i*i;
feld[j]=true;

没有检查是否j < nj >= n.

于 2013-09-23T13:50:26.897 回答
5

这段代码是错误的

bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    ...
}

假设 n == 10 和 i == 9,那么 j == 81 但你的 bool 数组中只有 10 个元素。

这就是你编写错误程序时的工作方式,有时它似乎可以工作,它甚至可能给出正确的答案,有时它会崩溃。这是非常重要的一课,实际上你很幸运能够早早学会。

于 2013-09-23T13:51:04.343 回答
0

实际上,这不仅仅是feld[j]=true;导致错误的原因。

此外,您在循环之前根本不需要该行。

因为,这是循环内的第一个案例。

于 2013-09-23T14:58:13.340 回答