【发布时间】:2016-08-16 15:13:26
【问题描述】:
我对问题PRIME1的回答 请解释我哪里错了。我收到分段错误。
这里是:
#include<cstdlib>
#include<iostream>
using namespace std;
int main(int argc, char** argv) {
int t=0,i=0,m=0,n=0;
cin>>t;
while(t--&&t<=10)
{
cin>>m>>n;
if(m>=1&&n-m<=100000)
{
int prime[n];
for(i=0;i<n;i++)
prime[i]=1;
for (int i=2; i*i<=n; i++)
{
if (prime[i] == true)
{
for (int j=i*2; j<=n; j += i)
prime[j] = false;
}
}
for (int k=m+1; k<n; k++)
if (prime[k])
cout <<k<<endl;
}
}
return 0;
}
【问题讨论】:
-
int prime[n];可能太大而无法放入堆栈。它应该类似于char* prime = new char[n];。使用后别忘了delete[]它。 (我不会将此作为答案发布,因为我没有通过提交来检查) -
bool prime可能占用更少的空间。std::vector<bool>占用的空间要少得多,但性能下降对 SPOJ 没有太大帮助。 -
不知道为什么这被否决了。也许我需要上学...¯\_(ツ)_/¯
-
您正在使用 VLA(
int prime[n];其中n不是常量表达式)不是标准 C++ 并且可能(gcc 这样做)分配在堆栈中。请遵循@MikeCAT 或@user4581301 的建议。
标签: c++ arrays primes sieve-of-eratosthenes