PAT乙级题1007,"段错误"的原因在哪?

img

尝试的修改:(但都失败了)

1.把数组a[2000]放到int main()外面,作为全局变量,同时扩大数组的容量到2000,防止爆栈,但还是显示段错误;

2.如果把2000换到10000的量级,OJ平台就显示运行超时;

代码:

#include
{

int a[2000];

int n, num = 2, i = 0;
cin >> n;
while (num <= n)
{
    if (num == 2)
    {
        a[i] = num;
        num += 1;
        i++;
    }
    else
    {
        int sign = 0;
        for (int k = i - 1; k >= 0; k--)
        {
            if (num % a[k] == 0)
            {
                sign++;
                break;
            }
        }
        if (sign == 0)
        {
            a[i] = num;
            i++;
        }
        num += 2;
    }
}
num = 0;
int k1 = 1;
while (k1 <= i && i > 1)
{
    if (a[k1] - a[k1 - 1] == 2)
    {
        num++;
    }
    k1++;
}
cout << num;

}

报错显示:

img

int main() {
    int a[2];
    int n, num = 2,count=0;
    cin >> n;
    a[1] = num;
    if (n>2)
    {
        while (num <= n)
        {
                int sign = 0;
                for (int k = 2; k < num; k++)
                {
                    if (num % k == 0)
                    {
                        sign++;
                        break;
                    }
                }
                if (sign == 0)
                {
                    a[0] = a[1];
                    a[1] = num;
                    if (a[1] - a[0] == 2) {
                        count++;
                    }
                }
            num++;
        }
    }
    cout << count;
}

a[2000]是作为全局变量放在了main函数外面

供参考:

#include <iostream.h>

using namespace std;


int isPrime(int n)    //素数判断
{
    int i;
    if(n <= 3)    return n > 1;
    for(i = 2 ; i*i <= n ; i++)
         if(n%i == 0) return 0;
    return 1;
}

int main()
{
    int k = 0,s[100001];
    for(int i = 1 ; i < 100001 ; i++)//对100000内的所有素数打表
    {
        if(isPrime(i))
        {
            s[k] = i;
            k++;
        }
    }

    int N,count = 0;
    cin >> N;
    for(int i = 1 ; ; i++)
    {
        if(s[i]>N) //超出范围N直接跳出循环
            break;
        if(s[i]-s[i-1] == 2) //相邻素数相差为2的可能性
            count++;
    }
    cout << count << endl;  //输出最后结果
    return 0;
}