分析:定義標記數組,初始化爲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;
}