都开始做蓝桥杯了, 还想啥最优解法啊? 暴力它不香吗 不动脑它不香吗? 这代码她不美吗?
储备知识
16进制转化为2进制:从最大位数开始,每一位都转化成4位二进制数。
如:34(16进制)——>0011 0100(二进制)。 其中,3转化为0011,4转化为0100。二进制转化为八进制:同理,从最后一位往前,三个三个取,不够三个就补0。
如:0011 0100(二进制)——>000 110 100(二进制)——>064(八进制)——>64(八进制)。
注意点:
1、注意输入要求小于10000位的16进制数,是小于10000位,不是小于10000!
2、输入格式为字符串,将16进制转化为2进制,2进制再转化为八进制输出。
3、注意字符串的遍历顺序(正向遍历还是反向遍历)
4、动脑子的解法是:写一个x进制自由转化为n进制的函数。调用函数转化后输出。参考大数运算的解法。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n; while(n--) {
string s,s1;
cin >> s;
int len = s.length();
for(int i = 0; i < len; i++) {
switch(s[i]) {
case '0' : s1+="0000"; break;
case '1' : s1+="0001"; break;
case '2' : s1+="0010"; break;
case '3' : s1+="0011"; break;
case '4' : s1+="0100"; break;
case '5' : s1+="0101"; break;
case '6' : s1+="0110"; break;
case '7' : s1+="0111"; break;
case '8' : s1+="1000"; break;
case '9' : s1+="1001"; break;
case 'A' : s1+="1010"; break;
case 'B' : s1+="1011"; break;
case 'C' : s1+="1100"; break;
case 'D' : s1+="1101"; break;
case 'E' : s1+="1110"; break;
case 'F' : s1+="1111"; break;
}
}
int len1 = s1.length();
if(len1 % 3 == 1) { s1.insert(0,"00"); len1 += 2; }
if(len1 % 3 == 2) { s1.insert(0,"0"); len1 += 1; }
string s3; //存放结果
bool flag = false;
for(int i = 0; i < len1; i += 3) {
string s2 ; s2 += s1[i]; s2 += s1[i+1]; s2 += s1[i+2];
if(s2 == "000" && flag == true) s3 += "0";
else if(s2 == "001") { s3 += "1"; flag = true; }
else if(s2 == "010") { s3 += "2"; flag = true; }
else if(s2 == "011") { s3 += "3"; flag = true; }
else if(s2 == "100") { s3 += "4"; flag = true; }
else if(s2 == "101") { s3 += "5"; flag = true; }
else if(s2 == "110") { s3 += "6"; flag = true; }
else if(s2 == "111") { s3 += "7"; flag = true; }
}
cout << (n ? s3+'\n' : s3);
}
return 0;
}