十六进制转八进制

十六进制至八进制的转换要借用二进制作为跳板,即将十六进制先转换为二进制,再将转换过的二进制数转换为八进制。

原理还是很简单的,每1位十六进制数可对应4位二进制数,每1位八进制数可对应3位二进制数(因为7的二进制为111)。

 

其中有一点需要注意的就是当十六进制所转换的二进制数位不能被3整除时需要在串首加1或2个“0”以确保可以完整地转换为八进制。

 

尽量使用字符串来储存以确保储存空间。

 

实行代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[10000010];//储存八进制数 
 4 
 5 int main(){
 6     int n;
 7     string str,str2;
 8     cin>>n;
 9     while(n--){
10         cin>>str;
11         int len=str.size();
12         str2="";
13         for(int i=0;i<len;i++){//将十六进制转换为二进制 
14             if(str[i]=='1'){
15                 str2+="0001";
16                 continue;
17             }
18             if(str[i]=='0'){
19                 str2+="0000";
20                 continue;
21             }
22             if(str[i]=='2'){
23                 str2+="0010";
24                 continue;
25             }if(str[i]=='3'){
26                 str2+="0011";
27                 continue;
28             }
29             if(str[i]=='4'){
30                 str2+="0100";
31                 continue;
32             }
33             if(str[i]=='5'){
34                 str2+="0101";
35                 continue;
36             }
37             if(str[i]=='6'){
38                 str2+="0110";
39                 continue;
40             }
41             if(str[i]=='7'){
42                 str2+="0111";
43                 continue;
44             }
45             if(str[i]=='8'){
46                 str2+="1000";
47                 continue;
48             }
49             if(str[i]=='9'){
50                 str2+="1001";
51                 continue;
52             }
53             if(str[i]=='A'){
54                 str2+="1010";
55                 continue;
56             }
57             if(str[i]=='B'){
58                 str2+="1011";
59                 continue;
60             }
61             if(str[i]=='C'){
62                 str2+="1100";
63                 continue;
64             }
65             if(str[i]=='D'){
66                 str2+="1101";
67                 continue;
68             }
69             if(str[i]=='E'){
70                 str2+="1110";
71                 continue;
72             }
73             if(str[i]=='F'){
74                 str2+="1111";
75                 continue;
76             }
77         }
78         if(len%3==2)//补位 
79         str2="0"+str2;
80         else if(len%3==1)
81         str2="00"+str2;
82         len=str2.size();
83         int j=0;
84         for(int i=0;i<=len-2;i+=3){//将二进制转换为八进制 
85             a[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
86             j++;
87         }
88         for(int i=0;i<j;i++){//输出八进制数 
89             if(i==0&&a[i]==0)//如含前导零则略掉 
90             continue;
91             cout<<a[i];
92         }
93         cout<<endl;
94     }
95     return 0;
96 }

 

posted @ 2017-02-20 21:18  Kiven#5197  阅读(2601)  评论(0编辑  收藏  举报