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

    技术2023-10-06  95

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

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

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

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

    样例输入   2   39   123ABC

    样例输出   71   4435274

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

    代码

    #include<iostream> #include<string> 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<string>

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

    Processed: 0.022, SQL: 9