PAT乙級1005:継続(3 n+1)推測(25)
1731 ワード
タイトル:
カラズ(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行の最後の数字の後にはスペースがありません.
サンプルを入力:
出力サンプル:
以下は私のソースです.
カラズ(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
サンプルを入力:
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;
}