准备蓝桥杯-dyx--十六进制转换八进制

来源:互联网 发布:mac note 编辑:程序博客网 时间:2024/05/20 21:20
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示

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


#include<iostream>#include<cstring>using namespace std;int main(){    //每一个十六进制的数都可以转换成四位二进制的数。    //1-0001,2-0010,3-0011,4-0100,5-0101,6-0110,7-0111,8-1000,9-1001,    //A-1010,B-1011,C-1100,D-1101,E-1110,F-1111,就是这样例如9A就是10011010    //3个二进制为一位八进制.    string dyx,wyx;//dyx表示输入的十六进制的字符串,wyx表示转换过来的字符串.    int n;    cin>>n;    while(n--)    {        cin>>dyx;        wyx="";        for(int i=0;i<dyx.length();i++)        {            switch(dyx[i])            {                case'0':wyx+="0000";break;                case'1':wyx+="0001";break;                case'2':wyx+="0010";break;                case'3':wyx+="0011";break;                case'4':wyx+="0100";break;                case'5':wyx+="0101";break;                case'6':wyx+="0110";break;                case'7':wyx+="0111";break;                case'8':wyx+="1000";break;                case'9':wyx+="1001";break;                case'A':wyx+="1010";break;                case'B':wyx+="1011";break;                case'C':wyx+="1100";break;                case'D':wyx+="1101";break;                case'E':wyx+="1110";break;                case'F':wyx+="1111";break;                default:break;            }        }        int len=wyx.length();        //修正位数        //在向左(或向右)取三位时,取到最高位(最低位)如果无法凑足三位,        //可以补0再进行换算.        if(len%3==1)        wyx="00"+wyx;        else if(len%3==2)        wyx="0"+wyx;        bool flag;        flag=false;        for(int i=0;i<=wyx.length()-3;i+=3)        {            int num=(4*(wyx[i]-'0')+2*(wyx[i+1]-'0')+(wyx[i+2]-'0'));            if(num)            flag=true;            if(flag)            cout<<num;        }        cout<<endl;    }    return 0;}


0 0
原创粉丝点击