问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码一:
不过,只通过了样例哈
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int c[10];
int main()
{
int n;
cin >> n;
string hex[11];
for (int i = 0; i < n; i++)
{
cin >> hex[i];
}
for (int i = 0; i < n; i++)
{
char b[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int oct[10];
int len = hex[i].length() - 1;
for (int j = 0; j < hex[i].length(); j++)
{
for (int k = 0; k < 16; k++)
{
if (hex[i][j] == b[k])
{
c[len--] = k;
}
}
}
long long int dec = 0;
len = hex[i].length();
for (int i = 0; i < len; i++)
{
dec += c[i] * pow(16, i);
}
int e = 0;
while (dec >= 8) {
oct[e++] = dec % 8;
dec = dec / 8;
}
oct[e] = dec;
for (int j = e; j >= 0; j--)
{
cout << oct[j];
}
cout << endl;
}
return 0;
}
代码二:
参照了大神们写的
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int c[10];
string trans(char a)//十六进制转二进制
{
switch (a)
{
case'0':return "0000"; break;
case'1':return "0001"; break;
case'2':return "0010"; break;
case'3':return "0011"; break;
case'4':return "0100"; break;
case'5':return "0101"; break;
case'6':return "0110"; break;
case'7':return "0111"; break;
case'8':return "1000"; break;
case'9':return "1001"; break;
case'A':return "1010"; break;
case'B':return "1011"; break;
case'C':return "1100"; break;
case'D':return "1101"; break;
case'E':return "1110"; break;
case'F':return "1111"; break;
}
}
int main()
{
int n;
cin >> n;
string hex[11];
for (int i = 0; i < n; i++)
{
cin >> hex[i];
}
for (int i = 0; i < n; i++)
{
string oct;
string bin;
for (int j = 0; j < hex[i].length(); j++)
{
bin += trans(hex[i][j]);
}
int k = bin.length() % 3;
if (k == 1)
{
bin="00"+bin;//表示在下标为零的前方,插入“00”
}
if (k == 2)
{
bin = "0" + bin;//表示在下标为零的前方,插入“0”
}
int t = 0;
while (t < bin.length() - 2)
{
oct += (bin[t] - '0') *pow (2,2) + (bin[t + 1] - '0') * pow(2, 1)
+ (bin[t + 2] - '0') * pow(2, 0) + '0';
t = t + 3;
}
if (oct[0] == '0') //消前导0的操作
{
for (int k = 0; k < oct.length(); k++)
{
oct[k] = oct[k + 1];
}
}
cout << oct << endl;
}
return 0;
}
`作为一个新手这道题坑了我好久。每次提交代码总是出现运行超时。我就去查看了别人的代码,发现我采用的第一种方法出现了复杂度过高等问题。