当我尝试生成m和n之间的所有素数(m和n包括)时,为什么会出现运行时错误?

时间:2015-05-09 11:52:40

标签: c++

当我尝试生成m和n之间的所有素数(m和n,包括端点)时,为什么会出现运行时错误?

 #include<iostream>
 using namespace std;
 typedef long long int ll;
 int main()
 {
ll n,m,i,ch,x,t;
cin>>t;
while(t--)
{
cin>>m>>n;
int a[n+1];
//a[n+1]={1};
for(i=2;i<=n;i++)
{
    a[i]=1;
}
for(i=2;i<=n;i++)
{
    if(a[i]==1)
    {
    x=2;
    ch=0;
    while((x*i)<=n)
    {
        if(a[x*i]==1)
        {
            a[x*i]=0;
            ch++;
        }
        x++;
    }
    if(ch==0)
        break;
    }
}
for(i=m;i<=n;i++)
{
    if(a[i]==1&&i!=1)
        cout<<i<<"\n";
}
cout<<'\n';
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

好的,从评论中的链接我们有以下约束

m and n (1 <= m <= n <= 1000000000, n-m<=100000)

所以你的算法很可能会在行中失败

int a[n+1];

对于大数字n:

n = 1000000000(1e9!)整数(4字节)的数组需要3.7GB的RAM!

所以你的方法不适用于大数字,因为它占用了太多内存!

(我可以在本地计算机上重现它,只需在数组定义之前和之后添加cout消息)

修改

要使此算法有效,您应该在堆上保留内存(而不是堆栈),并至少按int -> unsigned char最小化大小:

...
while(t--)
{
 cin>>m>>n;

 unsigned char *a = new unsigned char[n+1];
 ...
 delete[] a;
}