遍历数组每个数的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")