题目

问题描述
  给定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;
string to2(char c){
	switch(c){
		case '0':return "0000";
		case '1':return "0001";
		case '2':return "0010";
		case '3':return "0011";
		case '4':return "0100";
		case '5':return "0101";
		case '6':return "0110";
		case '7':return "0111";
		case '8':return "1000";
		case '9':return "1001";
		case 'A':return "1010";
		case 'B':return "1011";
		case 'C':return "1100";
		case 'D':return "1101";
		case 'E':return "1110";
		case 'F':return "1111";
	}
}
string to8(string bin){
	if(bin=="000")
		return "0";
	else if(bin=="001")
		return "1";
	else if(bin=="010")
		return "2";
	else if(bin=="011")
		return "3";
	else if(bin=="100")
		return "4";
	else if(bin=="101")
		return "5";
	else if(bin=="110")
		return "6";
	else if(bin=="111")
		return "7";
}
int main(){
	int n;
	string str;
	string bin;
	string oct;
	cin>>n;
	while(n--){
		cin>>str;
		bin = "";
		oct = "";
		// 得到16进制转的2进制 
		for(int i=0;i<str.length();i++)
			bin += to2(str[i]);
		// 如果不是3的整倍数,前面添0,方便转8进制 
		while(bin.length()%3!=0)
			bin.insert(0,"0");  // 在bin[0]位置插入0 
		// 每三位2进制转一位8进制
		for(int i=0;i<bin.length();i+=3)
			oct += to8(bin.substr(i,3));
		// 如果8进制开头有0,删除0 
		while(oct[0]=='0')
			oct.erase(0,1); // 在oct[0]位置开始删除长度为1的字符串 
		cout<<oct<<endl;
	}
	return 0;	
}

查看题解目录