蓝桥---十六进制转八进制(进制关系)
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,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 }
-