C++ pat b 1005 继续(3n+1)猜想测试点1 3 4都过不了 不知道哪里出的问题

1005 继续(3n+1)猜想测试点1 3 4都过不了,不知道哪里出的问题


#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int x[10000]={0};
bool cmp(int a, int b) {return a > b;}
void n3(int a){
    while(a!=1){
        if(a%2==1){
            a=(3*a+1)/2;
            x[a]=1;
        }
        else if(a%2==0){
            a=a/2;
            x[a]=1;
        }
    }
}
int main(){
    int n,a,flag=0;
    int k[100]={0};
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a;
        if(!x[a]&&i!=0){
            k[flag]=a;
            flag++;
            n3(a);
        }
        else if(!x[a]){
            n3(a);
        }
        else{
            continue;
        }
    }
    sort(k,k+flag,cmp);
    for(int i=0;i<flag-1;i++){
        printf("%d ",k[i]);
    }
    if(k[flag-1]!=0)
        cout<<k[flag-1];
}

以下回答参考GPT并且由妙妙大帅整理:
你的程序有可能出现数组越界的情况。数组 x 的大小为 10000,但在函数 n3 中,当 a 大于等于 10000 时,会访问 x 数组的越界元素,可能导致程序出错。可以将数组 x 的大小设为一个更大的值,比如 1000000,来解决这个问题。

另外,当输入的第一个数是 1 时,你的程序可能会出现错误,因为你没有判断 a 是否为 1,如果 a 为 1,则会陷入死循环。你可以在函数 n3 的开头加上这样一句代码:

if (a == 1) return;

这样就可以避免陷入死循环了。