-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