十六进制转八进制
简单粗暴易懂,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;
}