求各位大佬移步另一个做法,帮我看看有什么猫病,指路:https://blog.csdn.net/KarlieKloss/article/details/88558898
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<iostream>
using namespace std;
string trans(char a)
{
switch(a)
{
case'0':return "0000";
case'1':return "0001";
case'2':return "0010";
case'3':return "0011";
case'4':return "0100";
case'5':return "0101";
case'6':return "0110";
case'7':return "0111";
case'8':return "1000";
case'9':return "1001";
case'A':return "1010";
case'B':return "1011";
case'C':return "1100";
case'D':return "1101";
case'E':return "1110";
case'F':return "1111";
}
}
int main()
{
//输入
int n;
string sixteen[10];//(1<=n<=10)
cin>>n;
for(int i=0;i<n;i++)
{
cin>>sixteen[i];
}
for(int i=0;i<n;i++)
{
string eight;
string two;
char eig;
for(int j=0;j<sixteen[i].length();j++)
two+=trans(sixteen[i][j]);
int m=two.length()%3;
if(m==1)two.insert(0,"00");
else if(m==2)two.insert(0,"0");
if(!(two[0]=='0'&&two[1]=='0'&&two[2]=='0'))
{
eig=(two[0]-'0')*4+(two[1]-'0')*2+(two[2]);
eight+=eig;
}
for(int k=3;k<two.length();k+=3)
{
if(two.substr(k,3)=="000")eight+="0";
else if(two.substr(k,3)=="001")eight+="1";
else if(two.substr(k,3)=="010")eight+="2";
else if(two.substr(k,3)=="011")eight+="3";
else if(two.substr(k,3)=="100")eight+="4";
else if(two.substr(k,3)=="101")eight+="5";
else if(two.substr(k,3)=="110")eight+="6";
else if(two.substr(k,3)=="111")eight+="7";
}
cout<<eight<<endl;
}
return 0;
}