十六进制至八进制的转换要借用二进制作为跳板,即将十六进制先转换为二进制,再将转换过的二进制数转换为八进制。
原理还是很简单的,每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 }
原文链接: https://www.cnblogs.com/Kiven5197/p/6421561.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/249657
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!