我的思路:
因为题中所给数据量不大,我考虑 建立一个 二维数组 Tab
Tab[][0]记录 是否覆盖( 1表示覆盖 ) Tab[][1]记录是否存在输入的序列中( 1表示存在 )
在读入数据后 首先 一遍for循环 按顺序遍历 确定 i 是否为输入的元素 如果是则寻找序列中 被该元素 i 覆盖的元素 并相应 Tab[][0]置1
下一次 for 循环 再遍历一遍 Tab 由 Tab[i][1]==1 && Tab[i][0]==0 确定 i 存在 所给序列 并且 未被覆盖 则 归纳到 一个新的数组中
排序 后逆序输出··
总结:
花了两个小时···调试出的错误 有①判断循环终止条件的逻辑不对②在打表的for循环中 忽视了 数组越界的问题
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int K, i, n, j;
int Tab[101][2];
while( cin>>K )
{
memset( Tab, 0, sizeof(Tab) );
for( i=0; i<K; i++ ){
cin>>n;
Tab[n][1]=1;
}
for( i=2; i<101; i++ )
{
if( Tab[i][1]==1 ){
j=i;
while( j!=1 )
{
if( j%2==0 ){
j/=2;
if( j<101 ){
Tab[j][0]=1;
}
}
else{
j=(j*3+1)/2;
if(j<101){
Tab[j][0]=1;
}
}
}
}
}
int ans[101];
for( i=2, j=0; i<101; i++ )
{
if( Tab[i][1]==1 && Tab[i][0]==0 )
ans[j++] = i;
}
sort(ans, ans+j);
cout<<ans[--j];
for( i=--j; i>=0; i-- )
cout<<" "<<ans[i];
cout<<endl;
}
return 0;
}