【发布时间】: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