分析:定义标记数组,初始化为false,给定数据标记为true。验证过程中设计数据全部标记为false,最后标记为true的数据为最后答案。
#include <iostream>
#include <algorithm>
using namespace std;
bool flag[1024];
int num[512];
int res[128];
void Initial(){//初始化将所有的数标记为false
for(int i=0; i<1024; i++){
flag[i] = false;
}
}
void Callatz(int a){//验证卡拉兹猜想
while(a!=1){
a=(a%2==0)?(a/2):(3*a+1)/2;
flag[a] = false;//验证过程中的数标记为false
}
}
int main()
{
int n;
cin>>n;
Initial();
for(int i=0; i<n; i++){
cin>>num[i];
flag[num[i]] = true;//输入数据全部标记为true
}
for(int i=0; i<n; i++){
int var = num[i];
if(flag[var]){
Callatz(var);
}
}
int ind = 0;
sort(num, num+n);
for(int i=0; i<n; i++){//标记为true的数据即欲输出数据
if(flag[num[i]]){
res[ind++] = num[i];
}
}
for(int i=ind-1; i>=0; i--){
cout<<res[i]<<(i!=0?" ":"\n");
}
return 0;
}