十六进制转八进制
十六进制至八进制的转换要借用二进制作为跳板,即将十六进制先转换为二进制,再将转换过的二进制数转换为八进制。
原理还是很简单的,每1位十六进制数可对应4位二进制数,每1位八进制数可对应3位二进制数(因为7的二进制为111)。
其中有一点需要注意的就是当十六进制所转换的二进制数位不能被3整除时需要在串首加1或2个“0”以确保可以完整地转换为八进制。
尽量使用字符串来储存以确保储存空间。
实行代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[10000010];//储存八进制数 4 5 int main(){ 6 int n; 7 string str,str2; 8 cin>>n; 9 while(n--){ 10 cin>>str; 11 int len=str.size(); 12 str2=""; 13 for(int i=0;i<len;i++){//将十六进制转换为二进制 14 if(str[i]=='1'){ 15 str2+="0001"; 16 continue; 17 } 18 if(str[i]=='0'){ 19 str2+="0000"; 20 continue; 21 } 22 if(str[i]=='2'){ 23 str2+="0010"; 24 continue; 25 }if(str[i]=='3'){ 26 str2+="0011"; 27 continue; 28 } 29 if(str[i]=='4'){ 30 str2+="0100"; 31 continue; 32 } 33 if(str[i]=='5'){ 34 str2+="0101"; 35 continue; 36 } 37 if(str[i]=='6'){ 38 str2+="0110"; 39 continue; 40 } 41 if(str[i]=='7'){ 42 str2+="0111"; 43 continue; 44 } 45 if(str[i]=='8'){ 46 str2+="1000"; 47 continue; 48 } 49 if(str[i]=='9'){ 50 str2+="1001"; 51 continue; 52 } 53 if(str[i]=='A'){ 54 str2+="1010"; 55 continue; 56 } 57 if(str[i]=='B'){ 58 str2+="1011"; 59 continue; 60 } 61 if(str[i]=='C'){ 62 str2+="1100"; 63 continue; 64 } 65 if(str[i]=='D'){ 66 str2+="1101"; 67 continue; 68 } 69 if(str[i]=='E'){ 70 str2+="1110"; 71 continue; 72 } 73 if(str[i]=='F'){ 74 str2+="1111"; 75 continue; 76 } 77 } 78 if(len%3==2)//补位 79 str2="0"+str2; 80 else if(len%3==1) 81 str2="00"+str2; 82 len=str2.size(); 83 int j=0; 84 for(int i=0;i<=len-2;i+=3){//将二进制转换为八进制 85 a[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0'); 86 j++; 87 } 88 for(int i=0;i<j;i++){//输出八进制数 89 if(i==0&&a[i]==0)//如含前导零则略掉 90 continue; 91 cout<<a[i]; 92 } 93 cout<<endl; 94 } 95 return 0; 96 }