十六进制转八进制

 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 }  

这道题的精髓就在于通过二进制做桥梁,这样可以减少时间。

原文地址:https://www.cnblogs.com/hcd-dyh/p/8682955.html