题目
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int main () {
int n;
cin >> n;
string hex, bin;
string *oct = new string[n];
for (int i=0; i<n; i++) {
hex = "";
bin = "";
oct[i] = "";
cin >> hex;
for (int j=0; j<hex.size(); j++) {
switch(hex[j]){
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;
default:
break;
}
}
//补0,使它为3的倍数
if(bin.size()%3 == 1)
bin = "00" + bin;
if(bin.size()%3 == 2)
bin = "0" + bin;
///将每3个二进制字符转换为相应的整数
int d = 0;
for (int k=0; k<bin.size(); k += 3) {
d = 4*(bin[k]-'0') + 2*(bin[k+1]-'0') + (bin[k+2]-'0');
oct[i] += d + '0';
}
}
for (int i=0; i<n; i++) {
int j = 0;
while (oct[i][j] == '0')
j++;//去除首部的0
cout << &oct[i][j] << endl; //&取地址,输出剩余字符串
}
return 0;
}
总结
切记要初始化,可以减少很多麻烦
借鉴:https://blog.csdn.net/b1055077005/article/details/54562345