#include <iostream>
using namespace std;
#include <string>
#include <algorithm>
#include <cctype>
string reSort(string a) {
char temp;
for (int i = 0; i < a.size(); i++) {
for (int j = i + 1; j < a.size(); j++) {
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
return a;
}
char sw(char a) {
char result;
char A;
if (islower(a)) {
A = toupper(a);
}
else{
A= a;
}
switch (A) {
case '0':
result = '0';
break;
case '1':
result = '8';
break;
case '2':
result = '4';
break;
case '3':
result = 'C';
break;
case '4':
result = '2';
break;
case '5':
result = 'A';
break;
case '6':
result = '6';
break;
case '7':
result = 'E';
break;
case '8':
result = '1';
break;
case '9':
result = '9';
break;
case 'A':
result = '5';
break;
case 'B':
result = 'D';
break;
case 'C':
result = '3';
break;
case 'D':
result = 'B';
break;
case 'E':
result = '7';
break;
case 'F':
result = 'F';
break;
default:
result = a;
}
return result;
}
int main() {
string aIn;
string bIn;
string str;
getline(cin, aIn, ' ');
getline(cin, bIn);
str = aIn + bIn;
int as;
int bs;
if (str.size() % 2 == 0) {
as = str.size() / 2;
bs = str.size() / 2;
} else {
as = (str.size() + 1) / 2;
bs = (str.size() - 1) / 2;
}
string a(as, ' ');
string b(bs, ' ');
for (int i = 0; i < str.size(); i++) {
if (i % 2 == 0) {
a[i / 2] = str[i];
} else {
b[(i - 1) / 2] = str[i];
}
}
a = reSort(a);
b = reSort(b);
for (int i = 0; i < str.size(); i++) {
if (i % 2 == 0) {
str[i] = sw(a[i / 2]);
} else {
str[i] = sw(b[(i - 1) / 2]);
}
}
cout << str << endl;
}
不难但是非常绕一道题。2进制翻转转化我觉得没必要再专门搞一套算法去算了,直接穷举吧)
标记几个易错点:
string的大小一定要提前分配好,不然存不下去的
字符串是按ASCII码进行重排序的,用冒泡排序写一个就好
奇数偶数位置一定弄清

京公网安备 11010502036488号