Я пытаюсь предварительно вычислить все простые числа. в большом диапазоне от 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;
}
P.reserve(1000000005);
будет занимать4 * 1000000005
байта. Что близко к 4 Гб. Перейдите на 64-битную версию, и это не будет проблемой, но для 32-битной машины вы не сможете выделить столько памяти... - person Mats Petersson   schedule 19.06.2014P.max_size()
сообщит вам численный предел для переменнойsize
, это предел, при котором, если вы добавите еще один элемент, размер будет равен нулю - на 64-битной машине это будут полные 64 бита, но даже если вы Если вы купите каждую планку памяти, когда-либо произведенную в мире, вы не сможете выделить столько памяти, поскольку 64-разрядные процессоры текущего поколения ограничены 48 битами ОЗУ, то есть 1024 ТБ. - person Mats Petersson   schedule 19.06.2014std::deque
;-) - person doctorlove   schedule 19.06.2014