问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:
1.先将十六进制数转换成二进制数,每一位十六进制转换成四位二进制。
2.再由二进制数转换成八进制,每三位二进制转换为一位八进制
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
using namespace std;
int main()
{
int n;//输入n个十六进制
int str_length;
cin>>n;
string in_str[n];//输入十六进制字符串
string out_str[n];//输出八进制字符串
string str;
string binarystr;//中间代换,存二进制
string octstr;//中间代换,存八进制
for(int i=0; i<n; i++)接收十六进制字符串
{
cin>>in_str[i];
}
for(int i=0; i<n; i++)//
{
binarystr="";
str = in_str[i];
str_length = str.length();
for(int j=0; j<str_length; j++)//十六进制转换为二进制
{
switch(str[j])
{
case '0':
binarystr+="0000";
break;
case '1':
binarystr+="0001";
break;
case '2':
binarystr+="0010";
break;
case '3':
binarystr+="0011";
break;
case '4':
binarystr+="0100";
break;
case '5':
binarystr+="0101";
break;
case '6':
binarystr+="0110";
break;
case '7':
binarystr+="0111";
break;
case '8':
binarystr+="1000";
break;
case '9':
binarystr+="1001";
break;
case 'A':
binarystr+="1010";
break;
case 'B':
binarystr+="1011";
break;
case 'C':
binarystr+="1100";
break;
case 'D':
binarystr+="1101";
break;
case 'E':
binarystr+="1110";
break;
case 'F':
binarystr+="1111";
break;
default:
break;
}
}
str_length =binarystr.length();
if(str_length%3==1) //补零,三个二进制转换为一个八进制
binarystr = "00" + binarystr;
if(str_length%3==2)
binarystr = "0" + binarystr;
str_length =binarystr.length();
octstr ="";
int t;
for(int j=0; j<str_length; j+=3)//二进制转换为八进制
{
t = (binarystr[j]-'0')*4 + (binarystr[j+1]-'0')*2 + (binarystr[j+2]-'0')*1;
//int类型转换成string类型
/*
//方法一
switch(t)
{
case 0:octstr += '0';break;
case 1:octstr += '1';break;
case 2:octstr += '2';break;
case 3:octstr += '3';break;
case 4:octstr += '4';break;
case 5:octstr += '5';break;
case 6:octstr += '6';break;
case 7:octstr += '7';break;
default:break;
}*/
//方法二
stringstream ss;
ss << t; //int类型转换成string类型
octstr += ss.str();
}
for(int j=0; j<3; j++)
if(octstr[0]=='0') octstr=octstr.erase(0,1); //删除为0的首字符
out_str[i] = octstr;//传给输出变量
}
for(int i=0; i<n; i++)
cout<<out_str[i]<<endl;
return 0;
}