Hash散列
--将访问过的数字散列到arr数组中,值为1代表访问过,跳出循环;
--vector数组从小到大排序,sort(v.begin(), v.end());
--vector数组从大到小排序
bool cmp(int a, int b) {return a > b;}
sort(v.begin(), v.end(),cmp);
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[10000];//最大值不一定是99 * 3 + 1;
bool cmp(int a, int b) {return a > b;}
int main() {
int k, n, flag = 0;
cin >> k;
vector<int> v(k);
for (int i = 0; i < k; i++) {
cin >> n;
v[i] = n;
while (n != 1) {
if (n % 2 != 0) n = 3 * n + 1;
n = n / 2;
if (arr[n] == 1) break;//跳出,说明当前数字已经经过猜想
arr[n] = 1;//映射
}
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); i++) {
if (arr[v[i]] == 0) {
if (flag == 1) cout << " ";
cout << v[i];
flag = 1; //循环控制输出“ ”
}
}
return 0;
}