十六进制转八进制(c++)

1.题目信息:

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

输入的第一行为一个正整数n (1<=n<=10)。

接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

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

【注意】

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

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

样例输入

2

39

123ABC

样例输出

71

4435274

【提示】

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

2.问题分析:

注意到存在提示内容,考虑到需要使用提给要求,故不能直接使用格式化输入输出进行直接转换输出。

3.基本思路:

将十六进制转换为二进制
再将二进制转换为八进制

4.具体执行:

第一部分:

字符串s1获得所需十六进制数,并通过switch枚举转换为二进制的形式存入另一个字符串s2。

第二部分:

二进制转换为八进制是以三个二进制位为一组的,考虑到字符串的长度可能不被三整除,故使用if函数对不被三整除的两种情况进行前加0处理。

第三部分:

最后一个部分就是将二进制逐三个转换为八进制并逐个八进制位输出

注:考虑到可能前三位均为0,因此需要进行去0判断,此处使用的如下代码:

int flag = 0;
……
if(p)
flag = 1;
if(flag)
cout << p;

该用法的妙处是仅处理开头的0,而不会忽略中间的0。

5.完整代码如下:

    #include
    #include
    using namespace std;
    int main()
    {
        string s1,s2;
        int n;
        int i,j,k;
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>s1;
            s2="";
            for(j=0;j<s1.length();j++)
            {
                switch(s1[j])
                {
                case '0':s2+="0000";break;
                case '1':s2+="0001";break;
                case '2':s2+="0010";break;
                case '3':s2+="0011";break;
                case '4':s2+="0100";break;
                case '5':s2+="0101";break;
                case '6':s2+="0110";break;
                case '7':s2+="0111";break;
                case '8':s2+="1000";break;
                case '9':s2+="1001";break;
                case 'A':s2+="1010";break;
                case 'B':s2+="1011";break;
                case 'C':s2+="1100";break;
                case 'D':s2+="1101";break;
                case 'E':s2+="1110";break;
                case 'F':s2+="1111";break;
                default:break;
                }
            }
            if(s2.length()%3==1)
            s2="00"+s2;
            if(s2.length()%3==2)
            s2="0"+s2;
            int flag=0;
            for(k=0;k<s2.length()-2;k+=3)
            {
                int p=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';
                if(p)
                flag=1;
                if(flag)
                cout<<p;
             } 
             cout<<endl;
         } 
         return 0;
    }

你可能感兴趣的:(#,蓝桥杯练习题,C/C++)