Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的代码试图找到0到n个数之间的所有素数,那么'+;1';在声明中';布尔素数[n+;1]';? 我是C++初学者,正在努力解决初学者在0到第n个数之间找到所有质数的问题。我在网上看到了这段代码,它工作得非常好_C++_Sieve Of Eratosthenes - Fatal编程技术网

我的代码试图找到0到n个数之间的所有素数,那么'+;1';在声明中';布尔素数[n+;1]';? 我是C++初学者,正在努力解决初学者在0到第n个数之间找到所有质数的问题。我在网上看到了这段代码,它工作得非常好

我的代码试图找到0到n个数之间的所有素数,那么'+;1';在声明中';布尔素数[n+;1]';? 我是C++初学者,正在努力解决初学者在0到第n个数之间找到所有质数的问题。我在网上看到了这段代码,它工作得非常好,c++,sieve-of-eratosthenes,C++,Sieve Of Eratosthenes,然而,我的问题是,“+1”在语句“bool prime[n+1];”中的用法是什么?我已经从代码中删除了它,一切似乎都很好。它是必要的还是多余的 void SieveOfEratosthenes(int n) { bool prime[n + 1]; memset(prime, true, sizeof (prime)); for (int p = 2; p * p <= n; p++) { // If prime[p] is not cha

然而,我的问题是,“+1”在语句“bool prime[n+1];”中的用法是什么?我已经从代码中删除了它,一切似乎都很好。它是必要的还是多余的

void SieveOfEratosthenes(int n) {

    bool prime[n + 1];
    memset(prime, true, sizeof (prime));



    for (int p = 2; p * p <= n; p++) {
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == true) {
            // Update all multiples of p
            for (int i = p * 2; i <= n; i += p)
                prime[i] = false;
        }
    }

    // Print all prime numbers
    for (int p = 2; p <= n; p++)
        if (prime[p])
            cout << p << endl;
}

int main() {
    int n = 1000;
    cout << "Following are the prime numbers smaller "
            << " than or equal to " << n << endl;
    SieveOfEratosthenes(n);
    return 0;
}
void siveoferatostenes(int n){
布尔素数[n+1];
memset(prime,true,sizeof(prime));

对于(int p=2;p*p <代码> C++ +>代码>数组中的大小<代码> n>代码>索引从代码< 0 > /> >代码> N-1 < /代码>。因此,对于您的问题,对于<代码> N< /代码>索引赋值<代码> N+1 < /Case>大小数组。因此,在C++中(和许多其他语言)定义素数为<代码> N< /代码>编号。大小为n的数组有一个从0到(n-1)的索引。在这种情况下,您需要检查每个数字,最多包括n。因此,您需要在数组中的索引
prime[n]
处为n指定一个点。只有将数组的大小增加1,此索引才会存在。否则,数组将停止在
prime[n-1]


即使你取出<代码> -1代码>,它的原因是C++对数组边界不挑剔——一旦你有一个数组,你可以在任何索引上合法地读写,不管索引是否安全。注意我在法律上说,不安全——这是一个潜在的非常危险的行为。

范围0…n包含n+1个数。这是S。调整数组所需的大小。“一切似乎都很正常”这是因为您通过离开数组的末尾来点击UB。如果删除+1,您将在数组边界之外写入最后一个值。这可能会导致非常严重的错误,因为您写入堆栈上不再属于此变量的内存。(可能是另一个变量,甚至可能是一个导致错误的错误的指针…)注意,用非恒定数组大小声明<代码> Prime<代码>不是合法的C++(但是,C99是合法的C)。您可能依赖于此处的编译器扩展。不,您不能合法读取越界。只是编译器不必强制执行它。请注意,编译器不禁止强制执行它;虽然通常不执行此操作,但编译器可以自由添加检查;这很难做到,因此大多数编译器即使在调试m中也不执行此操作颂歌。