#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码进行重排序的,用冒泡排序写一个就好
奇数偶数位置一定弄清