这代码她不美吗?——试题 基础练习 十六进制转八进制

都开始做蓝桥杯了, 还想啥最优解法啊? 暴力它不香吗 不动脑它不香吗? 这代码她不美吗?

储备知识

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;
 } 
发布了73 篇原创文章 · 获赞 61 · 访问量 4765

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104545672