Почему я получаю ошибку bad_alloc при реализации Решета Эратосфена

Я пытаюсь предварительно вычислить все простые числа. в большом диапазоне от 1 до 1000000005, используя Sieve of Eratosthenes, но получая ошибку после компиляции моего кода... Я думаю, что проблема связана с размером вектора, но когда я распечатал с помощью 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;
}

person Shantanu Singh    schedule 19.06.2014    source источник
comment
простой, запрос памяти не может быть выполнен. Вы пытаетесь зарезервировать объем памяти, который недоступен   -  person Rakib    schedule 19.06.2014
comment
На 32-битном компьютере этот P.reserve(1000000005); будет занимать 4 * 1000000005 байта. Что близко к 4 Гб. Перейдите на 64-битную версию, и это не будет проблемой, но для 32-битной машины вы не сможете выделить столько памяти...   -  person Mats Petersson    schedule 19.06.2014
comment
Также обратите внимание, что P.max_size() сообщит вам численный предел для переменной size, это предел, при котором, если вы добавите еще один элемент, размер будет равен нулю - на 64-битной машине это будут полные 64 бита, но даже если вы Если вы купите каждую планку памяти, когда-либо произведенную в мире, вы не сможете выделить столько памяти, поскольку 64-разрядные процессоры текущего поколения ограничены 48 битами ОЗУ, то есть 1024 ТБ.   -  person Mats Petersson    schedule 19.06.2014
comment
Вместо этого используйте std::deque ;-)   -  person doctorlove    schedule 19.06.2014


Ответы (1)


P.max_size() указывает насколько большим может быть вектор, что сильно отличается от того, сколько памяти доступно/может быть выделено в конкретный момент. bad_allocException выдается, когда оператор new не может выполнить запрос на выделение памяти для заданного размера. Как указал @Mats, явно на вашей платформе выделение не выполняется.

person Rakib    schedule 19.06.2014