SS_ 十六进制转八进制

SS_ 十六进制转八进制_第1张图片

目的1:16进制->2进制->8进制

目的2:进制转化注意添0和灭0(2处)


#include "iostream"
#include "string"
using namespace std;

int main(){
	int n;
	cin>>n;
	while(n--){
		string s_16;
		string s_8;
		string s_2;
		int length;
		cin>>s_16;
		length=s_16.length();
		//转化成二进制
		for(int i=0;i<length;i++){
			switch(s_16[i]){
				case '0':s_2+="0000";break;
				case '1':s_2+="0001";break;
				case '2':s_2+="0010";break;
				case '3':s_2+="0011";break;
				case '4':s_2+="0100";break;
				case '5':s_2+="0101";break;
				case '6':s_2+="0110";break;
				case '7':s_2+="0111";break;
				case '8':s_2+="1000";break;
				case '9':s_2+="1001";break;
				case 'A':s_2+="1010";break;
				case 'B':s_2+="1011";break;
				case 'C':s_2+="1100";break;
				case 'D':s_2+="1101";break;
				case 'E':s_2+="1110";break;
				case 'F':s_2+="1111";break;
			}
		}
		length=s_2.length();
		//3个二进制转化成一个八进制,如果s_2.length()不是3的倍数就报错
		if(length%3==1){
			s_2="00"+s_2;
		}
		if(length%3==2){
			s_2="0"+s_2;
		}
		//转化成八进制
		for(int i=0;i<length;i=i+3){
			int add=(s_2[i]-'0')*4+(s_2[i+1]-'0')*2+(s_2[i+2]-'0');
			switch(add){
				case 0:s_8+="0";break;
				case 1:s_8+="1";break;
				case 2:s_8+="2";break;
				case 3:s_8+="3";break;
				case 4:s_8+="4";break;
				case 5:s_8+="5";break;
				case 6:s_8+="6";break;
				case 7:s_8+="7";break;
			}
		}
		length=s_8.length();
		for(int i=0;i<length;i++){
			//将首位置0灭掉,就像数字电子逻辑的灭0操作
			if(i==0&&s_8[0]=='0'){
				continue;
			}
			cout<<s_8[i];
		}
		cout<<endl;
		
		
	}
	return 0;
	
}

这里2处switch语句省去了很多麻烦

你可能感兴趣的:(C++,蓝桥杯,十六进制转八进制)