PAT乙級1005:継続(3 n+1)推測(25)


タイトル:
カラズ(Callatz)推測は1001に記載されている.このテーマでは、状況が少し複雑です.
カラズの推測を検証すると,繰返し計算を避けるために,繰返し中に遭遇した各数を記録することができる.例えば、n=3を検証する場合、3、5、8、4、2、1を計算する必要があり、n=5、8、4、2を検証すると、繰り返し計算する必要がなく、カラズの推測の真偽を直接判定することができる.この4つの数はすでに検証3の時に遭遇したため、5、8、4、2は3によって「覆われた」数である.1つの数列のある数nを「キー数」と呼び、nが数列の他の数で上書きできない場合.
検証対象の一連の数値を指定すると、いくつかのキー数を検証するだけで、残りの数値を繰り返し検証する必要はありません.あなたの任務は、これらの重要な数字を見つけて、大きな順に出力することです.
入力フォーマット:各テスト入力には1つのテスト例が含まれ、1行目には正の整数K(<100)が与えられ、2行目にはK個の互いに異なる検証対象の正の整数n(1出力フォーマット:各テスト・インスタンスの出力が1行を占め、キー数を大きい順に出力します.数字の間は1つのスペースで区切られていますが、1行の最後の数字の後にはスペースがありません.
サンプルを入力:
6
3 5 6 7 8 11

出力サンプル:
7 6

以下は私のソースです.
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 110;
int Numbers[MAXN];
int ans[MAXN];
bool flag[MAXN] = {false};//    bool            

int main(){
	int n;
	cin >> n;
	for (int i = 0; i < n; i++){
		cin >> Numbers[i];
	}
	
	for (int i = 0; i < n; i++){
		int temp = Numbers[i];
		if (!flag[temp]){
			while (temp != 1){
				if (temp % 2 != 0){
					temp = (temp * 3 + 1) / 2;
					if (temp < MAXN) flag[temp] = true;
				}
				else{
					temp = temp / 2;
					if (temp < MAXN) flag[temp] = true;
				}
			}
		}//       ,   3N+1   ,                 
	}
	
	int cnt = 0;
	for (int i = 0; i < n; i++){
		if (!flag[Numbers[i]]){
			ans[cnt] = Numbers[i];
			cnt++;
		}
	}//               
	
	sort(ans, ans + cnt);
	for (int i = cnt - 1; i >= 0; i--){
		cout << ans[i];
		if (i > 0) cout << " ";
		else cout << endl;
	}//              
	
	return 0;
}