题目
思路
先把十六进制的字符串转为二进制的字符串,再将二进制字符串转八进制字符串。
code
#include <iostream>
#include <string>
using namespace std;
string to_two(string a)//输入一个16进制的字符串,转换为二进制
{
string bin_str = "";
for (int i=0;i<a.length();i++)
{
switch(a[i])
{
case '0': bin_str += "0000"; break;
case '1': bin_str += "0001"; break;
case '2': bin_str += "0010"; break;
case '3': bin_str += "0011"; break;
case '4': bin_str += "0100"; break;
case '5': bin_str += "0101"; break;
case '6': bin_str += "0110"; break;
case '7': bin_str += "0111"; break;
case '8': bin_str += "1000"; break;
case '9': bin_str += "1001"; break;
case 'A': bin_str += "1010"; break;//10
case 'B': bin_str += "1011"; break;//11
case 'C': bin_str += "1100"; break;//12
case 'D': bin_str += "1101"; break;//13
case 'E': bin_str += "1110"; break;//14
case 'F': bin_str += "1111"; break;//15
}
}
//cout<<bin_str<<endl;
return bin_str;
}
string to_eight(string a)
{
string eig_str = "";
for (int i=0;i<a.length();i+=3)
{
if(a.substr(i,3)=="000")eig_str+="0"; //提取k之后的三个字符(包括k)
else if(a.substr(i,3)=="001")eig_str+="1";
else if(a.substr(i,3)=="010")eig_str+="2";
else if(a.substr(i,3)=="011")eig_str+="3";
else if(a.substr(i,3)=="100")eig_str+="4";
else if(a.substr(i,3)=="101")eig_str+="5";
else if(a.substr(i,3)=="110")eig_str+="6";
else if(a.substr(i,3)=="111")eig_str+="7";
}
if (eig_str.substr(0, 1) == "0") eig_str = eig_str.substr(1, eig_str.length()-1);//判断八进制第一个字符串是否为0,是的话删除
return eig_str;
}
int main()
{
int c;
string bin_str;//储存二进制的字符串
string eig_str = "";//储存八进制的字符串
cin>>c;//输入待输入16进制字符串的数量
string a[10];
for(int i=0;i<c;i++) cin>>a[i];//输入16进制字符串,赋值给a字符串数组
for(int i=0;i<c;i++)
{
bin_str = to_two(a[i]);//转化为二进制字符串
if (bin_str.length() % 3 == 1) bin_str.insert(0, "00");//原先是四个字符一组,现在转化为三个字符一组 ,补上前面可能不足的0位
else if(bin_str.length() % 3 == 2) bin_str.insert(0, "0");
eig_str = to_eight(bin_str);//二进制转八进制
cout<<eig_str<<endl;
}
}