十六进制转八进制 蓝桥练习 C++

十六进制转八进制
简单粗暴易懂,C++实现。
看题:::

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

下面代码实现:

#include<iostream>
#include <vector>
#include <cmath>
using namespace std;
void getBinary(int c, vector<int> &sz);
int getInteger(char c);
void show(vector<int> &sz);
int main()
{

	int n;
	int i,j;
	char date[10][100000];
	vector<int> sz;
	//数据输入 
	cin>>n;
	for (i = 0; i < n; i ++)
	{
		cin>>date[i];
	}
	for (i = 0; i < n; i ++)
	{
		for (j = 0; date[i][j] != '\0'; j ++)
		{
			getBinary(getInteger(date[i][j]), sz);	
		}
		//补前导0
		if (sz.size() % 3 == 2){
			sz.insert(sz.begin(),0);		
		}
		//补前导0
		if (sz.size() % 3 == 1){
			sz.insert(sz.begin(),0);
			sz.insert(sz.begin(),0);
		}
		show(sz);
		sz.clear();
	}
	return 0;
 } 
 /**
  * 二进制串转八进制输出
 */
void show(vector<int> &sz)
{
	vector<int> te;
	int n,j=0;
	int count=0;
	int ei=0;
	
	for (int i = sz.size()-1; i >= 0; i--)
	{
		ei += sz[i]*pow(2,count++);
		if(count == 3){
			count = 0;
			te.push_back(ei);
			ei = 0;
		} 
	}
	while (te[te.size()-1] == 0){
		te.pop_back();
	}
	for (int i = te.size()-1; i >= 0; i--)
	{
		cout<<te[i];
	}
	cout<<"\n";
}
/**
 * 将10进制的二进制表示追加进vector容器中
*/
void getBinary(int c, vector<int> &sz)
{

	int ns[16][4] = {{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},
				{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},
				{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};
	sz.push_back(ns[c][0]);
	sz.push_back(ns[c][1]);
	sz.push_back(ns[c][2]);
	sz.push_back(ns[c][3]);
}
/**
 * 根据传入的十六进制字符,返回对应的十进制
 * 例如:传入‘A’,返回10
*/
int getInteger(char c)
{
	int s;
	if (c >= '0' && c <= '9')
		s = (int)c-48;
	else s = c-'A'+10;
	return s;
}
发布了17 篇原创文章 · 获赞 10 · 访问量 677

猜你喜欢

转载自blog.csdn.net/wuyoucsdn/article/details/104660825