【解析】直接模拟,详见代码
#include
#include
using namespace std;
int toint(char c){//十六进制转10进制
if (c>='A'&&c<='F'){
return c-'A'+10;
}
return c-'0';
}
int a[25][25];//保存输入数据
struct node{//不同灰度的数量
int hd;//灰度
int sl;//数量
}c[300];
void myprint(int x){//将10进制打印为16进制
char c;
if (x>9){
c='A'+x-10;
}else{
c=x+'0';
}
cout<y.sl;
}
int main() {
int n;
cin>>n;
string s;
for (int i=1;i<=n;i++){
cin>>s;
int t;
for (int j = 0; j < s.size(); j += 2) {//转换为10进制保存到数组中
t = toint(s[j]) * 16 + toint(s[j + 1]);
a[i][j / 2 + 1] = t;
c[t].sl++;
}
}
for (int i=1;i<=255;i++){//初始化灰度值
c[i].hd=i;
}
sort(c,c+256,cmp);//排序
for (int i=0;i<16;i++){//打印排名前16
myprint(c[i].hd/16);
myprint(c[i].hd%16);
}
cout<
感谢之江学院石老师提供的更简练的代码:
#include
using namespace std;
string s[23], p = "0123456789ABCDEF";
int n, his[256], cn, a[23][23], t[16];
vector>v;
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> s[i];
cn = s[i].size() / 2;
for(int j = 0; j < cn; j++)
his[a[i][j] = p.find(s[i][2*j])*16 + p.find(s[i][2*j+1])]++;
}
for(int i = 0; i < 256; i++)
v.push_back({-his[i], i});
sort(v.begin(), v.end());
for(int i = 0; i < 16; i++)
printf("%02X", v[i][1]);
for(int i = 0; puts(""), i < n; i++)
for(int j = 0; j < cn; j++)
{
for(int k = 0; k < 16; k++)
t[k] = abs(v[k][1]-a[i][j]);
printf("%X", min_element(t, t + 16) - t);
}
}