资源限制 时间限制: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)这些操作要会