Description
给定n个十六进制正整数,输出它们对应的八进制数。
Input
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来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,01012,所以前面的二进制转为十六进制为 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