简单题,却交了17次才成功。
1.设置一个bool型数组进行标记,以空间换时间,以后应对这种情况敏感。
2.题中说不大于输入的a[i]不大于1000,但并不是说运行过程中不会产生大于1000的数,所以访问数组前可以加if(nn<1001),以防止re。
3.最后的倒序输出时,有可能a[0]是覆盖数而不用输出,从而一行最后一个是空格而不是回车,导致pe。所以应先统计输出个数。
#include<stdio.h>
#include<string>
int a[502];
bool ad[1002];
void fun(int nn)
{
while(nn!=1)
{
if(nn%2==0)nn=nn/2;
else{nn=nn*3+1;nn=nn/2;}
if(nn<1001)ad[nn]=false;
}
return;
}
int main()
{
int n,i;
int k[502],ct;
while(scanf("%d",&n)!=-1)
{
memset(ad,0,sizeof(ad));
for(i=0;i<n;i++){scanf("%d",&a[i]);ad[a[i]]=true;}
for(i=0;i<n;i++)fun(a[i]);
for(ct=i=0;i<n;i++)if(ad[a[i]])k[ct++]=a[i];
for(i=ct-1;i>=0;i--)printf( i == 0 ? "%d\n" : "%d ", k[ i ] );
}
return 0;
}