十六进制转八进制(蓝桥杯)

问题描述:
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

解答:

整体思路

十六进制——>二进制——>八进制

 

数据处理:

字符串string类型

 

细节注意:

  1. 依据十六进制一位拆四位和八进制一位拆三位的原则,可能出现二进制位数不匹配的情况
  2. 结果输出要求不能有前导0

 

个人参考代码:

 1 #include<iostream>
 2 #include<string>
 3 
 4 using namespace std;
 5  
 6  int main()
 7 {
 8     int n;
 9     cin>>n;
10     
11     string data[11];
12     for(int i=1;i<=n;i++)
13     {
14         cin>>data[i];
15     }
16     
17     for(int i=1;i<=n;i++)
18     {
19         string dataX16; 
20         dataX16=data[i];
21         
22         string dataX2;
23         
24         for(int p=0;p<=dataX16.length()-1;p++)
25         {
26             switch(dataX16[p])
27             {
28                 case '0': dataX2+="0000"; break;
29                 case '1': dataX2+="0001"; break;
30                 case '2': dataX2+="0010"; break;
31                 case '3': dataX2+="0011"; break;
32                 case '4': dataX2+="0100"; break;
33                 case '5': dataX2+="0101"; break;
34                 case '6': dataX2+="0110"; break;
35                 case '7': dataX2+="0111"; break;
36                 case '8': dataX2+="1000"; break;
37                 case '9': dataX2+="1001"; break;        
38                 case 'A': dataX2+="1010"; break;
39                 case 'B': dataX2+="1011"; break;
40                 case 'C': dataX2+="1100"; break;
41                 case 'D': dataX2+="1101"; break; 
42                 case 'E': dataX2+="1110"; break;
43                 case 'F': dataX2+="1111"; break;    
44                 }
45         }
46         
47         if(dataX2.length()%3==1) dataX2.insert(0,"00");
48         if(dataX2.length()%3==2) dataX2.insert(0,"0");
49         
50         string dataX8;
51         for(int p=0;p<=dataX2.length()-1-2;p+=3)
52         {
53             string tempData=dataX2.substr(p,3);
54             if(tempData=="000") dataX8+="0";
55             if(tempData=="001") dataX8+="1";
56             if(tempData=="010") dataX8+="2";
57             if(tempData=="011") dataX8+="3";
58             if(tempData=="100") dataX8+="4";
59             if(tempData=="101") dataX8+="5";
60             if(tempData=="110") dataX8+="6";
61             if(tempData=="111") dataX8+="7";
62         }
63         
64         for(int p=0;p<=dataX8.length()-1;p++)
65         {
66             if(dataX8[p]!='0')
67             {
68                 dataX8=dataX8.substr(p);
69                 break;
70             }
71             
72         }
73     
74         cout<<dataX8<<endl;
75         
76     }
77     
78     return 0;
79 }

 

posted @ 2019-01-18 23:56  bilibiliya  阅读(300)  评论(0编辑  收藏  举报