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;
这样就可以避免陷入死循环了。