#include using namespace std; const int N = 256; int b[N]; // 桶 vector top16; // 十六进制转十进制 int toDec(string s) { int sum = 0; if (s[0] >= 'A' && s[0] <= 'F') sum = (s[0] - 'A' + 10) * 16; else sum = (s[0] - '0') * 16; if (s[1] >= 'A' && s[1] <= 'F') sum += (s[1] - 'A' + 10); else sum += (s[1] - '0'); return sum; } // 十进制转十六进制 string toHex(int x) { string res; while (x) { int t = x % 16; if (t >= 10) res += t - 10 + 'A'; else res += t + '0'; x /= 16; } reverse(res.begin(), res.end()); if (res.empty()) return "00"; if (res.size() == 1) return "0" + res; return res; } // 在重新排完序的数据中找出离q最近的灰阶索引号 char find(int q) { int mi = INT_MAX, mp = 0; for (int i = 0; i < top16.size(); i++) { if (abs(q - top16[i]) < mi) { mi = abs(q - top16[i]); mp = i; } } if (mp >= 10) return (char)(mp - 10 + 'A'); return (char)(mp + '0'); } string c[N]; // 原始数组 int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { string s; cin >> s; // 录入字符串 c[i] = s; // 记录原始录入的数据 for (int j = 0; j < s.size(); j += 2) { string x; x.push_back(s[j]); x.push_back(s[j + 1]); b[toDec(x)]++; // 记录桶 } } // 开始查找前16位数量多的数字,那我就直接找16次最大的数字是多少,找到后我就把它的数量修改为0 for (int i = 1; i <= 16; i++) { int mx = 0, mp = 0; for (int j = 0; j < 256; j++) if (b[j] > mx) { mx = b[j]; mp = j; } b[mp] = 0; // 清零 // 前十六位的灰阶索引号 top16.push_back(mp); } // 输出前16位的灰阶索引号 for (int i = 0; i < top16.size(); i++) cout << toHex(top16[i]); cout << endl; // 遍历原始数据 for (int i = 1; i <= n; i++) { string s = c[i]; // 两位一组 for (int j = 0; j < s.size(); j += 2) { string x; x.push_back(s[j]); x.push_back(s[j + 1]); int q = toDec(x); // 这个数字,与res中哪个数字最接近,接近的含义是差的绝对值最小 cout << find(q); } cout << endl; } return 0; }