基础练习 十六进制转八进制

来源:互联网 发布:网络信息发布平台 编辑:程序博客网 时间:2024/05/01 07:43

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

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

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

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

#include <iostream>#include <string>#include <cstring>#include <cstdlib>#include <bits/stdc++.h>using namespace std;map<char,string> mp;map<string,string> mp1;void init(){    mp['0']="0000",mp['1']="0001";mp['2']="0010";mp['3']="0011";mp['4']="0100";    mp['5']="0101";mp['6']="0110";mp['7']="0111";mp['8']="1000";mp['9']="1001";    mp['A']="1010";mp['B']="1011";mp['C']="1100";mp['D']="1101";mp['E']="1110";    mp['F']="1111";    mp1["000"]="0";mp1["001"]="1";mp1["010"]="2";mp1["011"]="3";mp1["100"]="4";    mp1["101"]="5";mp1["110"]="6";mp1["111"]="7";}int main(){    init();    string s1,s2,s3,s4,s5;    int n;cin>>n;    while(n--)    {        cin >> s1;        int sz = s1.size();        s3 = mp[s1[0]];        s2="";        int tot = 0;        while(tot<4)        {            if(s3[tot]=='1')                break;            tot++;        }        while(tot<4)        {            s2+=s3[tot];            tot++;        }        for(int i=1;i<sz;i++)        {            s2+=mp[s1[i]];        }               if(s2.size()==0)        {            cout << "0" << endl;            continue;        }        else if(s2.size()%3==1)        {            s2 = "00"+s2;        }        else if(s2.size()%3==2)        {            s2 = "0"+s2;        }        sz = s2.size();        s4="";             for(int i=0;i<sz;)        {            s5="";            for(int j=0;j<3;j++,i++)                s5+=s2[i];            s4+=mp1[s5];        }        cout << s4 << endl;    }    return 0;}

0 0
原创粉丝点击