这题题意很简单,唯一的坑就是它读入的是十六进制!没审清楚题目输入输出导致写了高精度还一直wa
将读入的16进制转换成2进制,画个图看一下就能发现从 高位 到 低位的最后一个1的前一位进行搜索,节点从1开始,如果是1那么就往右节点走,否则往左节点走,再转成16进制输出就好了。
#include <bits/stdc++.h>
using namespace std;
const int maxn= 2000;
int a[maxn], b[maxn], t, k, id, n, m, l;
string s, ans;
int main() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d %d", &n, &m);
cout << m << endl;
while (m--) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
cin >> s;
l = s.size();
for (int j = l-1; j >= 0; j--) {
if (s[j] >= 'A' && s[j] <= 'Z') {
t = s[j]-'A'+10;
} else if (s[j] >= 'a' && s[j] <= 'z') {
t = s[j]-'a'+10;
} else t = s[j]-'0';
for (int j = a[0]+1; j <= a[0]+4; j++) {
a[j] = t%2;
t = t/2;
}
a[0] += 4;
}
id = 1;
for (; id <= a[0]; id++) {
if (a[id] == 1) break;
}
b[++b[0]] = 1;
for (int i = n; i > id; i--) {
if (a[i] == 1) {
b[++b[0]] = 1;
} else {
b[++b[0]] = 0;
}
}
ans = "";
for (int i = b[0]; i >= 1; i--) {
t = 0;
k = 1;
for (int j = i; j >= max(i-3, 1); j--) {
if (b[j]) t += k;
k *= 2;
}
i = i-3;
if (t <= 9) ans = (char)('0'+t)+ans;
else ans = (char)('A'+t-10)+ans;
}
cout << ans << endl;
}
}