十六进制转八进制-基础题

解题思路

从数学的角度来说,将十六进制转为八进制最好的方法就是 十六 -> 二 -> 八。
如果你是从 十六进制转为十进制的话 会多了几步 因为 十进制 转为八进制的话 中间 你还得转为 二进制 再由二进制转为八进制,所以我们就直接省掉十进制这步,直接由十六就跳为二。

只需把十六进制的每位数转为四位二进制数(2^4 == 16 四位二进制数表达的范围正好16)
再把所有的二进制 三个为一组 变换为八进制的形式
题目:
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274
具体参考代码:


#include <iostream>
//#include<algorithm>
#include<vector>
#include<string>
using namespace std;
//十六转二进制
int binaryNumber[] = { 1,2,4,8 };  //用于转换为2进制的需要
int number[] = { 10,11,12,13,14,15 }; //用于转换 十六进制的字母为数字
int q[] = { 0,0,0,0 }; //用于保存十六进制数中的某位数的二进制表达
void calculate(string a, int size, vector<int > & vec)
{
	int temp;
	int t, k, j;  //j是用来计算位数的 确保是四位输出
	for (int i = size - 1; i != -1; i--)
	{
		k = 3;
		j = 0;
		//将十六进制的每个数都提取出来
		if (a[i] >= 'A'&& a[i] <= 'Z')
		{
			t = number[a[i] - 'A'];
		}
		else
		{
			t = a[i] - '0';
		}
		//将十六进制的每个数都转化为二进制的数
		while (t >= 0)
		{
			if (j == 4) break;
			if (t - binaryNumber[k] >= 0)
			{
				t -= binaryNumber[k];
				k--;
				q[j] = 1;
			}
			else
			{
				k--;
				q[j] = 0;
			}
			++j;
		}
		//将转换过来得二进制数据逆序排列保存到容器中
		for (int i = 3; i != -1; --i)
		{
			vec.push_back(q[i]);
		}
	}
}
//二进制转八进制
void process(vector<int> & binary, vector<int> & vec, int n)
{
	int t, s = 0, j = 0;
	for (t = 0; t < n;)
	{
		if (n - t >= 3)
		{
			s = binary[t] + binary[t + 1] * 2 + binary[t + 2] * 4;
			vec.push_back(s);
			t += 3;
			s = 0;
		}
		else
		{

			s += binary[t] * binaryNumber[j];
			j++;
			++t;
		}
		if (t == n && j != 0)
		{
			vec.push_back(s);
		}
	}
}
int main()
{
	string a;
	vector<int > vec, vect;
	vector<string> t;
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
	{
		cin >> a;
		t.push_back(a);

	}
	for (vector<string>::iterator beg = t.begin(); beg != t.end(); ++beg) {
		vec.clear();
		vect.clear();
		calculate(*beg, (*beg).size(), vec);
		process(vec, vect, vec.size());
		int len = vect.size() - 1;
		while (!vect[len]) --len;
		for (int i = len; i >= 0; --i)
		{
			cout << vect[i];

		}
		cout << endl;
	}

	return 0;
}

该题只是一个思路:用于把非十进制的数转为其他进制的数。可以将该题转换为其他的转换

猜你喜欢

转载自blog.csdn.net/weixin_42792088/article/details/87970706