题目:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1 <= n <= 10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
#define N 1000
int main()
{
void change(string str, int l);
int i, n;
cin >> n; //输入个数n
string st[N]; //字符串数组
int len[N];
for (i = 0; i < n; i++) //输入n个十六进制字符串数组
{
cin >> st[i];
}
for (i = 0; i < n; i++)
{
len[i] = st[i].length();//读取st[i]的实际长度
}
for (i = 0; i < n; i++)
{
change(st[i], len[i]); //进行进制的转化,每次转化一个十六进制
}
return 0;
}
void change(string str, int l)
{
string add;
int i, j, k;
//下面的条件语句用来判断每个字符串是否为3的整数倍个,不够往前补0.
//因为八进制和十六进制换成二进制的最小公倍数位12及 3个16进制数
if (l % 3 == 1) //4 7 10 13 16 求余为1说明差2个0
{
add = "00";
str = add + str;
}
else if (l % 3 == 2) //5 8 11 14 求余为2说明差1个0
{
add = "0";
str = add + str;
}
l = str.length();//因为补零了,重新计算字符串长度
string str1 = "", str2 = "", str3 = "";
for (k = 0; k < l / 3; k++) //将字符串进行划分,每三个字符进行内循环的转化
{
//将字符串分为l/3组,一组一组算
str1 = "";
for (i = k * 3; i < k * 3 + 3; i++)
{
//每组有三个16进制数,所以循环3次。并且i与k是有关联的
switch (str[i])
{
case '0':str1 += "0000"; break;
case '1':str1 += "0001"; break;
case '2':str1 += "0010"; break;
case '3':str1 += "0011"; break;
case '4':str1 += "0100"; break;
case '5':str1 += "0101"; break;
case '6':str1 += "0110"; break;
case '7':str1 += "0111"; break;
case '8':str1 += "1000"; break;
case '9':str1 += "1001"; break;
case 'A':str1 += "1010"; break;
case 'B':str1 += "1011"; break;
case 'C':str1 += "1100"; break;
case 'D':str1 += "1101"; break;
case 'E':str1 += "1110"; break;
case 'F':str1 += "1111"; break;
default:break;
}
}
//以下循环转8进制 因为一次操作是对3个字符进行的,三个16进制的字符转成二进制就是12个字符,这12个字符按照每3个转为8进制,所以就有4组了
for (i = 0; i < 4; i++)
{ //因为有12位二进制数,所以会有4个8进制数
str2 = "";
for (j = i * 3; j < i * 3 + 3; j++)
{
//每三个二进制提取出来通过判断转为对应8进制数
str2 = str2 + str1[j];
}
if (str2 == "000")str3 += '0';
if (str2 == "001")str3 += '1';
if (str2 == "010")str3 += '2';
if (str2 == "011")str3 += '3';
if (str2 == "100")str3 += '4';
if (str2 == "101")str3 += '5';
if (str2 == "110")str3 += '6';
if (str2 == "111")str3 += '7';
}
}
for (i = 0; i < str3.length(); i++)
{
if (str3[0] == '0')
{
str3 = str3.erase(0, 1); //删除为0的首字符
}
else //如果字符串第一个字符不是0,就退出
break;
}
cout << str3 << endl;
}