问题描述
给定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 <math.h>
using namespace std;
const int N = 10;
string A[N];
void hexToOct (int n)
{
int temp; // temp为十进制数
int x;
char c;
int wei; // wei为十六进制的位数
for (int i = 0; i < n; i++)
{
temp = 0;
int j = 0;
c = A[i][j];
wei = 0;
while ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))
{
j++;
c = A[i][j];
wei++;
}
j = 0;
c = A[i][j];
while (wei)
{
if (c >= 'A' && c <= 'Z')
x = c - 'A' + 10;
else
x = c - '0';
temp = temp + x*pow (16, wei - 1);
j++;
c = A[i][j];
--wei;
}
j = 0;
int b = 0;
while (temp)
{
x = temp % 8;
temp /= 8;
j++;
b = b + x*pow(10, j-1);
}
cout << b << endl;
}
}
int main ()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
hexToOct (n);
return 0;
}
改进了一下,十六进制 -> 二进制 -> 八进制,但还是敌不过大型数据的输入
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
const int N = 10;
string A[N];
void ToOct (string B, int wei)
{
string C;
int i = 0;
int s = 0;
wei = wei * 4;
int j = wei % 3;
if (j == 1)
if (B[0] == '1')
cout << "1";
if (j == 2)
{
C.assign(B, 0, 2);
if (!C.compare ("01"))
cout << '1';
else if (!C.compare ("10"))
cout << '2';
else if (!C.compare ("11"))
cout << '3';
}
C = ""; // 清空C
for (i = j; i < wei; i += 3)
{
C.assign(B, i, 3); // 将字符串B的第i位开始3个字符赋给字符串C
if (!C.compare ("000") && i != 0)
cout << '0';
else if (!C.compare ("001"))
cout << '1';
else if (!C.compare ("010"))
cout << '2';
else if (!C.compare ("011"))
cout << '3';
else if (!C.compare ("100"))
cout << '4';
else if (!C.compare ("101"))
cout << '5';
else if (!C.compare ("110"))
cout << '6';
else if (!C.compare ("111"))
cout << '7';
C = ""; // 清空C
}
cout << endl;
}
void ToBin (int n)
{
string B;
cout << "B max is " << B.max_size() << endl;
char c;
for (int i = 0; i < n; i++)
{
int j = 0;
c = A[i][j];
while ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))
{
switch (c)
{
case '0': B = B + "0000"; break;
case '1': B = B + "0001"; break;
case '2': B = B + "0010"; break;
case '3': B = B + "0011"; break;
case '4': B = B + "0100"; break;
case '5': B = B + "0101"; break;
case '6': B = B + "0110"; break;
case '7': B = B + "0111"; break;
case '8': B = B + "1000"; break;
case '9': B = B + "1001"; break;
case 'A': B = B + "1010"; break;
case 'B': B = B + "1011"; break;
case 'C': B = B + "1100"; break;
case 'D': B = B + "1101"; break;
case 'E': B = B + "1110"; break;
case 'F': B = B + "1111"; break;
}
j++;
c = A[i][j];
}
// cout << B << endl; //输出二进制数
ToOct(B, j); // 二进制转化为八进制函数
B = "";
}
}
int main ()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
ToBin (n);
return 0;
}