2016-01-20 60 views
-1

我已經編寫代碼來生成範圍(使用Eratosthenes的修改過的篩)中的素數作爲競爭性編程。該代碼在我的Visual Studio上正常工作,但在網站上提供了SISGEV。我用這個,儘管在堆上分配內存,SISGEV錯誤? (生成素數)

static bool *prime = new bool[1000000001]; 

要聲明內存。無法理解SISGEV背後的原因。

以下是該功能,其參數爲the lower limit mthe 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; 
} 
+0

多大'N' ? – NathanOliver

+0

因此,在獲取size參數的同時分配一個固定大小的數組時,在將所有內容粘貼到SO之前,讀取代碼時確實沒有響鈴? – Voo

+3

在執行程序期間'prime'(即new)的初始化只發生一次,每次調用函數時都會調用delete []。 – Pixelchemist

回答

0
  1. 你的指針是一個靜態變量。在C++中,靜態變量的初始化只發生一次。然而,delete[]聲明是爲每個函數調用執行的。

  2. 請勿在風車上傾斜並使用std::vector而不是滾動原始內存解決方案。

使用std::vector一個簡單的實現:(添加擴展功能作爲練習留給讀者。)

#include <vector> 
#include <cmath> 
#include <cstddef> 
#include <algorithm> 
#include <iostream> 

std::vector<std::size_t> eratosthenes(std::size_t const n) 
{ 
    std::vector<bool> A(n, true); 
    std::vector<std::size_t> r; 
    auto const limit = static_cast<std::size_t>(
    std::ceil(std::sqrt(static_cast<double>(n)))); 
    // check all numbers up to sqrt(n) 
    for (std::size_t i = 2; i <= limit; ++i) 
    { 
    // if i is prime, 
    if (A[i]) 
    { 
     // i is prime, put it into return vector 
     r.push_back(i); 
     // set all multiples of i (below n) to false 
     for (std::size_t j = i*i; j < n; j+=i) 
     { 
     A[j] = false; 
     } 
    } 
    } 
    // fill rest of the primes > sqrt(n) into r 
    if (!r.empty()) 
    { 
    for (auto i = limit+1u; i < n; ++i) 
    { 
     if (A[i]) r.push_back(i); 
    } 
    } 
    return r; 
} 

打印出來:

int main() 
{ 
    for (auto v : eratosthenes(120)) 
    { 
    std::cout << v << "\n"; 
    } 
    return 0; 
}