我对问题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;
}
答案 0 :(得分:0)
for (int j=i*2; j<=n; j += i)
prime[j] = false;
这是导致bug的原因,prime是一个大小为n的数组,意味着它的最后一个成员的索引是n-1,这个for语句试图在最后一次迭代时访问prime [n](j <= n,意思是n仍然有效)修复此条件将条件更改为:
for(int j=i*2; j<n; ++j)
编辑: 也许由于代码逻辑错误或格式不良而发生分段错误,格式化代码后,它编译得很好并且不会导致分段错误(尝试输入{1,2,3}和{10,10,10}还有一些组合):
#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;
cin>>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)
{
cout << "poopy\n";
prime[j] = false;
}
}
}
for (int k=m+1; k<n; k++)
{
if (prime[k])
{
cout <<k<<endl;
}
}
}
}
return 0;
}