-1
我已经编写代码来生成范围(使用Eratosthenes的修改过的筛)中的素数作为竞争性编程。该代码在我的Visual Studio上正常工作,但在网站上提供了SISGEV。我用这个,尽管在堆上分配内存,SISGEV错误? (生成素数)
static bool *prime = new bool[1000000001];
要声明内存。无法理解SISGEV背后的原因。
以下是该功能,其参数为the lower limit m
和the upper limit n
。 索引元素>m
哪些不是素数被标记为false。
static bool *prime = new bool[1000000009];
void SieveOfEratosthenes(int m, int n)
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
memset(prime, true, n + 11);
int m2;
if (m > 10) {
m2 = m/10;
m2 = m2 * 10;
m2 = (2 * m2)/5;
}
else
m2 = 4;
prime[1] = false;
prime[2] = true;
prime[3] = true;
prime[5] = true;
for (int i = m2; i <= n; i += 2) {
if ((5*2)/2 >= n) break;
prime[i] = false;
prime[(3 * i)/2] = false;
prime[(5 * i)/2] = false;
}
int m3;
m3 = m % 7;
m3 = m - m3;
for (int p = 7; (p)*(p) <= n; p += 6) {
// If prime[p] is not changed, then it is a prime
if (prime[p] == true) {
// Update all multiples of p,
for (int i = p; i <= n; i += p) {
prime[m3+i] = false; //cout << i << " ";
if (prime[m3 + p+ 4]) prime[((p+4)*i)/p] = false;
if (prime[m3 + p + 6]) prime[((p+6)*i)/p] = false;
}
}
prime[7] = true;
prime[11] = true;
prime[13] = true;
}
// Print all prime numbers
for (int p = m; p <= n; p++)
if (prime[p])
cout << p << endl;
}
int main() {
//other code
delete[] prime;
}
多大'N' ? – NathanOliver
因此,在获取size参数的同时分配一个固定大小的数组时,在将所有内容粘贴到SO之前,读取代码时确实没有响铃? – Voo
在执行程序期间'prime'(即new)的初始化只发生一次,每次调用函数时都会调用delete []。 – Pixelchemist