一、题目大意
- PAT B1005
二、解题思路
- 题目给出数的范围在100以内,因此散列表大小可取105。
- 存储这个数列,同时设置每个数对应的散列值为1。
- 对数列中的每个数进行 3*n+1 猜想,将计算过程中的数的散列值改变为 0 。
- 从大到小输出散列值为 1 的数。
三、参考代码
#include<iostream>
using namespace std;
int m[105] = { 0 };
int s[105];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s[i];
m[s[i]] = 1;
}
for (int i = 0; i < n; i++) {
while ( s[i] != 1) {
if (s[i] % 2 == 1) s[i] = (3 * s[i] + 1) / 2;
else s[i] /= 2;
if (s[i] < 105) m[s[i]] = 0;
}
}
bool first = true;
for (int i = 104; i > 0; i--)
if (m[i]) {
if (!first) cout << ' ';
cout << i;
first = false;
}
cout << endl;
return 0;
}
四、解题感悟
- 需要先存储整个数列后再进行散列,否则处理前面的数时覆盖到后面的数的这种情况就会被忽略掉。
- 找到一个自习的好去处,暖和又不吵,太开心啦。