"蓝桥杯“基础练习:十六进制转八进制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuzhongqiang/article/details/78879762
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示

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


分析:

这个题考察的是进制转换,但是不是一般的进制转换,而是多位数,位数真的达到了100000,所以如果用一般的思路: 把十六进制转换成十进制,然后再由十进制转换成八进制是行不通的。

这里给出一种思路:  就是由十六进制转换成二进制,每四个一位,无非就是用字符串存放十六进制数,然后遍历一遍,得到二进制,

再由二进制转换成八进制,从后往前每三个数一位,就可以得到最终的结果。



#include <iostream>
#include <cstring>
using namespace std;


int main()
{
    int num;
    cin >> num;
    for (int i=0; i<num; i++)
    {
        string str;
        cin >> str;
        int len = str.length();
        string bin = "";

// 这里把输入的十六进制转换成二进制
        for (int i=0; i<len; i++)
        {
            switch(str[i])
            {
            case '0':
                bin += "0000";
                break;
            case '1':
                bin += "0001";
                break;
            case '2':
                bin += "0010";
                break;
            case '3':
                bin += "0011";
                break;
            case '4':
                bin += "0100";
                break;
            case '5':
                bin += "0101";
                break;
            case '6':
                bin += "0110";
                break;
            case '7':
                bin += "0111";
                break;
            case '8':
                bin += "1000";
                break;
            case '9':
                bin += "1001";
                break;
            case 'A':
                bin += "1010";
                break;
            case 'B':
                bin += "1011";
                break;
            case 'C':
                bin += "1100";
                break;
            case 'D':
                bin += "1101";
                break;
            case 'E':
                bin += "1110";
                break;
            case 'F':
                bin += "1111";
                break;
            }
        }

//这儿把二进制再转换成八进制
        int blen = bin.length();
        if (blen%3==1)
            bin = "00" + bin;
        else if (blen%3==2)
            bin = "0" + bin;


        bool flag = false;
        for (int i=0; i<=bin.length()-3; i+=3)
        {
            int num = (bin[i]-'0')*4 + (bin[i+1]-'0')*2 + (bin[i+2]-'0');
            if(num)
            {
                flag = true;
            }
            if(flag)
                cout << num;
        }
        cout << endl;
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/78879762