当我尝试在M和N之间生成所有质数时,为什么会遇到运行时错误(M和N(包括M和N)

Why am I getting runtime error when I am trying to generate all prime numbers between m and n(m and n inclusive)?

本文关键字:为什么 运行时错误 包括 遇到 之间      更新时间:2023-10-16

当我试图在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;
}

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

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

因此,您的算法很可能会在行中失败

int a[n+1];

对于大数字n:

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

因此,您的方法对于大量的RAM过多,因此您的方法无法很好地工作!

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

编辑

要使此算法工作,您应该在堆上保留内存(而不是堆栈),并至少通过int -> unsigned char最小化尺寸:

...
while(t--)
{
 cin>>m>>n;
 unsigned char *a = new unsigned char[n+1];
 ...
 delete[] a;
}