1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 cin>>n; 9 for(int k=1;k<=n;k++) 10 { 11 string s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串 12 cin>>s1; 13 s2="";//初始化 14 for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位 15 { 16 switch(s1[i]) 17 { 18 case ‘0‘:s2+="0000";break; 19 case ‘1‘:s2+="0001";break; 20 case ‘2‘:s2+="0010";break; 21 case ‘3‘:s2+="0011";break; 22 case ‘4‘:s2+="0100";break; 23 case ‘5‘:s2+="0101";break; 24 case ‘6‘:s2+="0110";break; 25 case ‘7‘:s2+="0111";break; 26 case ‘8‘:s2+="1000";break; 27 case ‘9‘:s2+="1001";break; 28 case ‘A‘:s2+="1010";break; 29 case ‘B‘:s2+="1011";break; 30 case ‘C‘:s2+="1100";break; 31 case ‘D‘:s2+="1101";break; 32 case ‘E‘:s2+="1110";break; 33 case ‘F‘:s2+="1111";break; 34 default:break; 35 } 36 } 37 int len=s2.length(); 38 39 if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数 40 s2="00"+s2; 41 else if(len%3==2) 42 s2="0"+s2; 43 int flag=0; 44 for(int i=0;i<=s2.length()-3;i+=3) 45 { 46 int num=4*(s2[i]-‘0‘)+2*(s2[i+1]-‘0‘)+(s2[i+2]-‘0‘); 47 if(num) 48 flag=1;//忽略前导0 49 if(flag) 50 cout<<num; 51 } 52 cout<<endl; 53 } 54 return 0; 55 }
这道题的精髓就在于通过二进制做桥梁,这样可以减少时间。