我的代码试图找到0到n个数之间的所有素数,那么'+;1';在声明中';布尔素数[n+;1]';? 我是C++初学者,正在努力解决初学者在0到第n个数之间找到所有质数的问题。我在网上看到了这段代码,它工作得非常好
然而,我的问题是,“+1”在语句“bool prime[n+1];”中的用法是什么?我已经从代码中删除了它,一切似乎都很好。它是必要的还是多余的我的代码试图找到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
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中也不执行此操作颂歌。