基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
十六进制转二进制的一种简单思路:
//十六进制转二进制
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
string s;
int main()
{
int n;
cin >> n;
int a[400000];
memset(a, 0, sizeof(a));//在不足三倍数的数位的时候,自动有零补充
int num = 0;
int m;
while(n)
{
memset(a, 0, sizeof(a));
cin >> s;
int len = s.length();
num = 0;
for(int i = len - 1 ; i >= 0 ; i--)//将输入的字符串倒着判断
{
if(s[i] >= '0' && s[i] <= '9')//如果是小于10的数字
m = s[i] - 48;
else m = s[i] - 55;
while(m)
{
a[num] = m % 2;//先得出来的是四位中的最左边的一个
m = m / 2;
num++;
}
}
//检验求16序列
for(int lll = len * 4 - 1 ; lll >= 0; lll--)
cout << a[lll] << " " ;
cout << endl;
}
return 0;
}
不过为了防止各种逆序出现问题,不如直接枚举。
#include<iostream>
using namespace std;
int main()
{
int n = 0; //记录输入数据的个数
cin >> n;
string sixteen[10]; //用来记录输入的数据
for(int i = 0;i < n;i++)
cin >> sixteen[i];
for(int i = 0;i<n;i++)
{
string eight;//记录八进制数据
string sum; //记录二进制数据
char eig;
//转换为二进制
for(int j = 0;j < sixteen[i].length();j++)
{
switch(sixteen[i][j])
{
case '0':sum += "0000";break;
case '1':sum += "0001";break;
case '2':sum += "0010";break;
case '3':sum += "0011";break;
case '4':sum += "0100";break;
case '5':sum += "0101";break;
case '6':sum += "0110";break;
case '7':sum += "0111";break;
case '8':sum += "1000";break;
case '9':sum += "1001";break;
case 'A':sum += "1010";break;
case 'B':sum += "1011";break;
case 'C':sum += "1100";break;
case 'D':sum += "1101";break;
case 'E':sum += "1110";break;
case 'F':sum += "1111";break;
default:break;
}
}
int m = sum.length() % 3;//将不足3倍数的填充一下
if(m == 1)
sum.insert(0,"00");
else if(m == 2)
sum.insert(0,"0");
//进行转换
if(!(sum[0] == '0' && sum[1] == '0' && sum[2] == '0'))
{
eig = (sum[0] - '0') * 4 + (sum[1] - '0') * 2 + (sum[2]);
eight = eight + eig;
}
for(int k = 3;k < sum.length();k = k + 3)
{
if(sum.substr(k,3) == "000")//从下标为k开始截取长度为3位:sum = "000"
eight += "0";
else if(sum.substr(k,3) == "001")
eight += "1";
else if(sum.substr(k,3) == "010")
eight += "2";
else if(sum.substr(k,3) == "011")
eight += "3";
else if(sum.substr(k,3) == "100")
eight += "4";
else if(sum.substr(k,3) == "101")
eight += "5";
else if(sum.substr(k,3) == "110")
eight += "6";
else if(sum.substr(k,3) == "111")
eight += "7";
}
//输出最终的八进制数
cout << eight << endl;
}
return 0;
}