十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。输入格式
输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。【注意】
输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。
样例输入
239
123ABC
样例输出
714435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
分析
先将数据全部转为2进制,再转为8进制。需要注意的是十六进制是4个2进制位对齐,八进制是3个2进制位对齐。
用到的函数
string app;
app.substr(i,n),截取字符串app从i开始的n个字符。
代码
#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> using namespace std; int main() { string oct=""; string hex=""; string inpu; int i; int n; cin>>n; while(n--){ cin>>inpu; hex=""; for(i=0;i<inpu.length();i++){ switch(inpu[i]){ case '0':hex+="0000";break; case '1':hex+="0001";break; case '2':hex+="0010";break; case '3':hex+="0011";break; case '4':hex+="0100";break; case '5':hex+="0101";break; case '6':hex+="0110";break; case '7':hex+="0111";break; case '8':hex+="1000";break; case '9':hex+="1001";break; case 'A':hex+="1010";break; case 'B':hex+="1011";break; case 'C':hex+="1100";break; case 'D':hex+="1101";break; case 'E':hex+="1110";break; case 'F':hex+="1111";break; default :break; } } oct=""; int mid=hex.length()%3;//八进制3字节对齐。所以要在前面先补齐"0" if(mid==1) hex= "00"+hex; if(mid==2) hex ="0"+hex; //cout<<hex<<endl; string octmid;//开始转换 for(i=0;i<hex.length();i=i+3){ octmid=hex.substr(i,3); //cout<<octmid<<" "; if(octmid=="000") oct +="0"; else if(octmid=="001") oct +="1"; else if(octmid=="010") oct +="2"; else if(octmid=="011") oct +="3"; else if(octmid=="100") oct +="4"; else if(octmid=="101") oct +="5"; else if(octmid=="110") oct +="6"; else oct +="7"; } if(oct[0]=='0') oct=oct.substr(1,oct.length()-1); cout<<oct<<endl; } return 0; }switch枚举不能枚举字符串就很伤。查了下是要用jdk1.8以上才有,可是我就是1.8的啊,所以有点迷,就换了if-else了。