2016-01-20 57 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; 
}