当我尝试生成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;
}
答案 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;
}