问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
最开始,当我看到这个题目的认为比较简单,最初的代码是直接使用了这两个函数scanf("%x"),printf("%o"),结果一提交上去,0分,郁闷了好久.... 在网上了解了别人的解决思想后,经过一番调试,终于解决了这个问题,所以打算在这里来总结一下。
首先,在题目中要求输入的16进制的长度不能超过100000,这个长度哪怕是long long类型也容纳不下,所以我们会优先考虑用字符串的形式来存放输入的16进制数据。由于每一个16进制数据占4个二进制位,而每一个8进制数据占3个二进制位。所以在这里我是将输入的16进制字符串转换为相应的二进制字符串,再将所得到的二进制字符串每三个一组,转换为相应的8进制字符串,进而将它输出。
但在这里,我们要注意几个问题:
1:由于二进制转换为8进制是每三个二进制一组的,所以当二进制字符串的长度不是3的整数倍的时候,就要在字符串的前面补上相应个数的 ‘0’ 来让二进制字符串的长度变成3的整数倍。
2:当上续过程转换完毕后,不要让8进制字符串前面的 ‘0’ 字符输出。(比如:八进制字符串为071时,应该输出为71)。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int n = 0;
cin >> n;
string str_Hex, str_Bin;
string *str_Oct = new string[n];
for(int i = 0; i < n; i++)
{
str_Hex = "";
str_Bin = "";
str_Oct[i] = "";
cin >> str_Hex;
for(int j = 0; j < str_Hex.size(); j++)
{
switch(str_Hex[j])
{
case '0': str_Bin += "0000"; break;
case '1': str_Bin += "0001"; break;
case '2': str_Bin += "0010"; break;
case '3': str_Bin += "0011"; break;
case '4': str_Bin += "0100"; break;
case '5': str_Bin += "0101"; break;
case '6': str_Bin += "0110"; break;
case '7': str_Bin += "0111"; break;
case '8': str_Bin += "1000"; break;
case '9': str_Bin += "1001"; break;
case 'A': str_Bin += "1010"; break;
case 'B': str_Bin += "1011"; break;
case 'C': str_Bin += "1100"; break;
case 'D': str_Bin += "1101"; break;
case 'E': str_Bin += "1110"; break;
case 'F': str_Bin += "1111"; break;
default: break;
}
}
//在二进制字符串的前面补'0',使得它的长度为3的整数倍
if((str_Bin.size() % 3) == 1)
str_Bin = "00" + str_Bin;
if((str_Bin.size() % 3) == 2)
str_Bin = "0" + str_Bin;
int d = 0;
for(int k = 0; k < str_Bin.size(); k += 3)
{
//将每3个二进制字符转换为相应的整数
d = 4*(str_Bin[k] - '0') + 2*(str_Bin[k+1] - '0') + (str_Bin[k+2] - '0');
str_Oct[i] += (d + '0');
}
}
for(int i = 0; i < n; i++)
{
//去除输出前面的'0'字符
int k = 0;
while(str_Oct[i][k] == '0')
k++;
cout << &str_Oct[i][k] << endl;
}
delete []str_Oct;
str_Oct = NULL;
return 0;
}