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

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

代码

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

                if (c)
                    flag = 1;
                if (flag)
                    cout << c;
            }
            cout << endl;
        }
    }
    return 0;

}

本题需要注意几个地方
一个 本题采用输入一个,输出一个的方式,而不是全部输入后再进行处理的方式
本题采用string a来储存输入的变量,采用string b来处理,每次循环,string b 都需要重新赋空。

还要注意从16进制转换为8进制需要进行补0,取余后+0的个数=3,二的三次方为8

另外本题采用了将16进制转换为2进制,在转换为八进制,是一个比较通用的办法,转化时,每次k+3;

本题采用了flag变量来消除前导0,flag变量一开始设为0,但在转换为8进制的途中,它一旦变为1,就再也无法变成0,也就是只要八进制的有一位不是0,后面的就都会输出

另外就是本题用到了一些字符串的操作,需要引入

#include

类似于
a=“00”+a;
以及a.length()求字符串的长度(这个长度不包括\0,“a”的长度为1)这些操作要会

你可能感兴趣的:(试题 基础练习 十六进制转八进制)