蓝桥---十六进制转八进制(进制关系)

Description

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

Input

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

Output

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

Sample Input

2
39
123ABC

Sample Output

71
4435274

注意

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

提示

先将十六进制数转换成某进制数,再由某进制数转换成八进制。

解题思路:

首先先讲一些相关知识点

二进制转十六进制

二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

从右到左 4位一切,例如 100111110110101,左边不满4位的可以用0补满 0100,1111,1011,0101,所以前面的二进制转为十六进制为 4FB5。

同理二进制转八进制,是以3位一段,分别转换成八进制。

十六进制转换成二进制

反过来,当看到 FD时,迅速将它转换为二进制数方法

先转换F:

看到F,需知道它是15,然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

接着转换 D:

看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。

所以,FD转换为二进制数,为: 11111101

由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成二进制数时,也可以先转换成十六进制,然后再转换成二进制。

再来说本题,十六进制转换成八进制,可先把十六进制转换成二进制,再把二进制转换成八进制。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 const int maxn=1e5+10;
17 using namespace std;
18 
19 map<string,string> mp;
20 
21 int main()
22 {
23     #ifdef DEBUG
24     freopen("sample.txt","r",stdin);
25     #endif
26     
27     mp["0"]="0000"; mp["1"]="0001"; mp["2"]="0010"; mp["3"]="0011"; mp["4"]="0100";
28     mp["5"]="0101"; mp["6"]="0110"; mp["7"]="0111"; mp["8"]="1000"; mp["9"]="1001";
29     mp["A"]="1010"; mp["B"]="1011"; mp["C"]="1100"; mp["D"]="1101"; mp["E"]="1110"; mp["F"]="1111";
30     
31     mp["000"]="0"; mp["001"]="1"; mp["010"]="2"; mp["011"]="3"; 
32     mp["100"]="4"; mp["101"]="5"; mp["110"]="6"; mp["111"]="7";
33     
34     int n;
35     cin>>n;
36     string str;
37     while(n--)
38     {
39         cin>>str;        //十六进制 
40         string temp="";    //存二进制 
41         string ans="";    //存八进制 
42         for(int i=0;i<str.size();i++)//十六进制转换成二进制 
43             temp+=mp[str.substr(i,1)];
44         while(temp.size()%3)//位数不足,前面补齐0 
45             temp="0"+temp;
46         int flag=0;
47         for(int i=0;i<=temp.size()-3;i+=3)//二进制转换成八进制 
48         {
49             if(flag==0)//除去前导0 
50             {
51                 if(mp[temp.substr(i,3)]=="0") continue;
52                 else flag=1;
53             }
54             ans+=mp[temp.substr(i,3)];
55         }
56         cout<<ans<<endl;
57     }
58     
59     return 0;
60 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12285971.html