遍历数组每个数的xxx定律,若数组中存在覆盖数,则将其置0,遍历完成数组后,数组中的非0数即为关键数,逆向输出即可。

#include <iostream>
using namespace std;

void key(int *a, int n){
    for (int i = 0; i < n; i++){
        int temp = a[i];
        while (temp > 1){
            if (temp % 2 == 0){
                temp = temp / 2;
                for (int j = 0; j < n; j++){
                    if(a[j] == temp) a[j] =0;	//将覆盖数置0,非0即为关键数
                }
            }
            else{
                temp = (3 * temp + 1) / 2;
                for (int j = 0; j < n; j++){
                    if(a[j] == temp) a[j] =0;	//将覆盖数置0,非0即为关键数
                }
            }
            
        }
    }
     for (int i = n-1; i >= 0; i--){//输入顺序的逆序输出
            if (a[i] != 0)
                cout<<a[i]<<" ";
}
}
int main() {
    int n;
    
    while (cin >> n && n != 0) { // 注意 while 处理多个 case
        int a[n];

        for (int i = 0; i < n; i++){	//输入序列
            cin >> a[i];
        }
        
        key(a,n);
    }
}
// 64 位输出请用 printf("%lld")