【问题标题】:Why am I getting bad_alloc error while implementing Sieve of Eratosthenes为什么在实施 Eratosthenes 筛时出现 bad_alloc 错误
【发布时间】:2014-06-19 08:23:00
【问题描述】:

我正在尝试预先计算所有素数。使用 Eratosthenes 的 Sieve 在 1 到 1000000005 的很大范围内,但在编译我的代码后出现错误......我认为问题与向量的大小有关,但是当我使用 P.max_size() 打印出来时,我没有。大于我的限制,所以我认为最大限制仍未达到,但我仍然陷入该错误。 请帮帮我

我将向量中的所有素数保存为 1,其余为 0

#include<iostream>
#include<cmath>
#include<cstdio>
#include<vector>
using namespace std;

int main()
{
  long long i,j;
  vector<int>P;
  P.reserve(1000000005);
  for(i=0;i<=1000000;i++)
  {
    P.push_back(1);
  }
 P[0]=0;
 P[1]=0;

for(i=2;i<=sqrt(1000000);i++)
{
  if(P[i]==1)
  {
     for(j=2;i*j<=100000;j++)
       P[i*j]=0;
  }
}

long long T,N,M;
scanf("%lld",&T);

while(T--)
{
 scanf("%lld %lld",&N,&M);
   for(i=N;i<=M;i++)
    {
      if(P[i]==1)
      printf("%lld\n",i);
    }
    printf("\n");
  }
 return 0;
}

【问题讨论】:

  • 简单,内存请求无法满足。您正在尝试保留不可用的内存量
  • 在 32 位计算机中,此 P.reserve(1000000005); 将占用 4 * 1000000005 字节。接近4GB。去 64 位,不会有问题,但是对于 32 位的机器,你不能分配这么多内存……
  • 还要注意P.max_size() 会告诉您size 变量的数值限制,即“如果再添加一个元素,大小将为零”的限制 - 在 64 位机器,那将是完整的 64 位,但是即使您购买了世界上生产的每一根内存条,您也无法分配那么多内存,因为当前一代 64 位处理器仅限于 48 位RAM,所以 1024TB。
  • 改用std::deque ;-)

标签: c++ vector sieve-of-eratosthenes


【解决方案1】:

P.max_size() 表示向量可以有多大,这与在特定时刻可用/可以分配多少内存完全不同。 bad_allocexception 当new 运算符无法满足给定内存大小的分配请求时抛出。正如@Mats 指出的那样,显然在您的平台上分配失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2011-09-26
    • 2014-04-15
    • 2020-10-23
    • 2021-09-29
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多