written by: 东篱下の悠然
思路:
- 每次输入一个数就立即计算 3n+1 ,并把计算 3n+1 过程中路过的数打标记
- 将原数组排序,遍历数组,如果这个数被别的数做了标记就说明不是关键数,跳过;否则就是关键数字,输出
学习:
- 使用不定长数组vector
- 使用cmp函数自定义排序
代码:
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main() {
int n; cin >> n;
vector<int> v(n); //存储输入
int a[100000] = {0}; //用于标记,初始化为0
int x;
for(int i = 0; i < n; i ++) {
cin >> x;
v[i] = x; //将原数存入
while(x != 1){ //计算3n+1
if(x & 1) x = x * 3 + 1;
x /= 2;
if(a[x] == 1) break; //如果做过标记了就说明之前已经走过了,就没必要再往下走了
a[x] = 1; //做标记
}
}
sort(v.begin(), v.end(), cmp); //给原数按照从大到小排序
bool f = 0;
for(int i = 0; i < n; i ++) {
if(a[v[i]] == 1) continue; //如果这个数已经被做了标记,表示被其它数走过,不是关键数,不输出
else {
if(f) cout << " "; //第一个数前面没空格,以后每个数前面都带一个空格
cout << v[i];
f = 1;
}
}
return 0;
}