问题描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
解答:
整体思路
十六进制——>二进制——>八进制
数据处理:
字符串string类型
细节注意:
- 依据十六进制一位拆四位和八进制一位拆三位的原则,可能出现二进制位数不匹配的情况
- 结果输出要求不能有前导0
个人参考代码:
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 cin>>n; 10 11 string data[11]; 12 for(int i=1;i<=n;i++) 13 { 14 cin>>data[i]; 15 } 16 17 for(int i=1;i<=n;i++) 18 { 19 string dataX16; 20 dataX16=data[i]; 21 22 string dataX2; 23 24 for(int p=0;p<=dataX16.length()-1;p++) 25 { 26 switch(dataX16[p]) 27 { 28 case '0': dataX2+="0000"; break; 29 case '1': dataX2+="0001"; break; 30 case '2': dataX2+="0010"; break; 31 case '3': dataX2+="0011"; break; 32 case '4': dataX2+="0100"; break; 33 case '5': dataX2+="0101"; break; 34 case '6': dataX2+="0110"; break; 35 case '7': dataX2+="0111"; break; 36 case '8': dataX2+="1000"; break; 37 case '9': dataX2+="1001"; break; 38 case 'A': dataX2+="1010"; break; 39 case 'B': dataX2+="1011"; break; 40 case 'C': dataX2+="1100"; break; 41 case 'D': dataX2+="1101"; break; 42 case 'E': dataX2+="1110"; break; 43 case 'F': dataX2+="1111"; break; 44 } 45 } 46 47 if(dataX2.length()%3==1) dataX2.insert(0,"00"); 48 if(dataX2.length()%3==2) dataX2.insert(0,"0"); 49 50 string dataX8; 51 for(int p=0;p<=dataX2.length()-1-2;p+=3) 52 { 53 string tempData=dataX2.substr(p,3); 54 if(tempData=="000") dataX8+="0"; 55 if(tempData=="001") dataX8+="1"; 56 if(tempData=="010") dataX8+="2"; 57 if(tempData=="011") dataX8+="3"; 58 if(tempData=="100") dataX8+="4"; 59 if(tempData=="101") dataX8+="5"; 60 if(tempData=="110") dataX8+="6"; 61 if(tempData=="111") dataX8+="7"; 62 } 63 64 for(int p=0;p<=dataX8.length()-1;p++) 65 { 66 if(dataX8[p]!='0') 67 { 68 dataX8=dataX8.substr(p); 69 break; 70 } 71 72 } 73 74 cout<<dataX8<<endl; 75 76 } 77 78 return 0; 79 }