[PAT B] 1005は、(3N + 1)推測を継続しました

1005は続行(3N + 1)の推定(25点)

Kharazi(Callatz)推測の説明は、1001に与えられています。このトピックでは、状況は多少複雑です。

ダブルカウントを避けるために、番号が遭遇した各再帰的に記録することができたとき、私たちはKharaziの推測を検証する場合。例えば、n = 3の場合は、検証のために、我々は、我々は、n = 5,8,4,2を確認する場合、3,5,8,4,2,1を計算する必要がある、それはKharazi推測直接決定することができます検証に遭遇したとき、それは数4 3を持っているので信憑性は、ダブルカウントせずに、我々は数の5,8,4,2 3「報道」と呼ばれています。私たちは、nは、シリーズの他の図でカバーすることができない場合は、「キーの数」の数であるn個の列に番号を呼び出します。

今検証する一連の番号に与えられた、我々は唯一のそれらのいくつかのキー番号を確認する必要がある、あなたは残りの番号を確認するために繰り返されている必要はありません。あなたの仕事は降順に出力することによると、これらのキー数値を見つけることです。

入力フォーマット:

N(1 <n≤100)各テストは、テスト入力を含む正の整数値は、最初の行がKの整数正が与えられる(<100)、2行目は検証する互いにKの別を与えます、数字間のスペースで区切られました。

出力フォーマット:

出力キー数値の順にライン毎の各テストケース出力、。数字の間の空間によって分離されたが、スペースを含まない行の後、最後の番号。

サンプル入力:

6
3 5 6 7 8 11

出力例:

7 6

####考え
Callatz分析1.マーキングデジタルとして解決
キーが新しいアレイに配置され、非標識の数である場合2.
3.降順出力

#include <iostream>
#include <algorithm>
using namespace std;


int main() {
	int flag[100001] = { 0 }, num[101] = { 0 }, ans[101] = { 0 };
	int n, t, number = 0;

	//测试关键数 输入
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> t, num[i] = t;

		//做Callatz 如果是奇数 则执行t=3*t+1 
		//因为奇数执行该操作必然为偶数 所以直接执行 t/=2
		//标记
		while (t != 1)
			t % 2 ? t = 3 * t + 1 : 0, t /= 2, flag[t] = 1;
	}

	//如果 未被标记 则为 关键数,加入ans
	for (int i = 0; i < n; i++)
		if (!flag[num[i]])
			ans[number++] = num[i];

	sort(ans, ans + number, greater<int>());

	//输出 最后一位无空格
	for (int i = 0; i < number; i++) {
		cout << ans[i];

		if (i != number - 1)
			cout << " ";
	}

	return 0;
}

公開された29元の記事 ウォンの賞賛6 ビュー526

おすすめ

転載: blog.csdn.net/weixin_43910320/article/details/104680218