我在spoj上的PRIME1中得到分割错误.我该如何根除它?

I am getting a segmentation error in PRIME1 on spoj. How should I eradicate it?

本文关键字:何根 错误 分割 上的 spoj PRIME1 我在      更新时间:2023-10-16

我对问题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;
}
for (int j=i*2; j<=n; j += i)
prime[j] = false;

这就是导致错误的原因,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 << "poopyn";
                        prime[j] = false;
                    }
                }
            }
        for (int k=m+1; k<n; k++)
        {
            if (prime[k])
            {
                cout <<k<<endl;
            }
        }
        }
    }
    return 0;
}