蓝桥杯练习系统 试题 基础练习 十六进制转八进制 C++实现

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

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

const int maxn = 100010;
string hs,bs,os;//存十六进制、二进制、八进制 

map<char,string> table;//16到2的映射 
map<string,char> table2;//2到8的映射 

//初始化映射关系 
void init() {
	table['0'] = "0000";
	table['1'] = "0001";
	table['2'] = "0010";
	table['3'] = "0011";
	table['4'] = "0100";
	table['5'] = "0101";
	table['6'] = "0110";
	table['7'] = "0111";
	table['8'] = "1000";
	table['9'] = "1001";
	table['A'] = "1010";
	table['B'] = "1011";
	table['C'] = "1100";
	table['D'] = "1101";
	table['E'] = "1110";
	table['F'] = "1111";
	
	table2["000"] = '0';
	table2["001"] = '1';
	table2["010"] = '2';
	table2["011"] = '3';
	table2["100"] = '4';
	table2["101"] = '5';
	table2["110"] = '6';
	table2["111"] = '7';
}

//删除开头多余的0
void deleteZero(string& str) {
	while(str[0] == '0') {
		str.erase(0,1);
	}
}

void BinToOct() {
	//当二进制串不是3的倍数,给它补足
	while (bs.size() % 3 != 0) {
		bs = "0" + bs;
	}
	//初始化os
	os = ""; 
	//每3个二进制位对应一个八进制串 
	for (int i = 0; i < bs.size(); i+=3) {
		string str = bs.substr(i, 3);
		os += table2[str];
	}
	//删除开头多余的0 
	deleteZero(os); 
}

void HexToBin() {
	//初始化bs
	bs = ""; 
	//遍历十六进制串,每个十六进制字符转换成二进制串 
	for (int i = 0; i < hs.size(); i++) {
		bs += table[hs[i]];
	}
	//删除开头多余的0 
	deleteZero(bs); 
}

int main() {
	init();
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> hs;
		HexToBin();
		BinToOct();
		cout << os << endl; 
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值