给定n个十六进制正整数,输出它们对应的八进制数

#include
#include
#include
using namespace std;
int main(){
 void change(string str,int l);
 int i,n;
 cin>>n;
 string st[n];
 int len[n];
 for(i=0;i<n;i++){
  cin>>st[i];
 }
 for(i=0;i<n;i++){
  len[i]=st[i].length();//读取st[i]的实际长度 
 }
 for(i=0;i<n;i++){
  change(st[i],len[i]);
 }
 return 0;
}
void change(string str,int l){
 string add;
 int i,j,k;
 //下面的条件语句用来判断每个字符串是否为3的整数倍个,不够往前补0.
 //因为八进制和十六进制换成二进制的最小公倍数位12.及3个16进制数 
 if(l%3==1){
  add="00";
  str=add+str; 
 }
 else if (l%3==2){
  add="0";
  str=add+str;
 } 
 l=str.length();//因为补零了,重新计算字符串长度 
 string str1="",str2="",str3="";
 for(k=0;k<l/3;k++){   //将字符串分为l/3组,一组一组算 
  str1="";
  for(i=k*3;i<k*3+3;i++){ //每组有三个16进制数,所以循环3次。并且i与k是有关联的 
   switch(str[i]){
    case '0':str1+="0000";break;
    case '1':str1+="0001";break;
    case '2':str1+="0010";break;
    case '3':str1+="0011";break;
    case '4':str1+="0100";break;
    case '5':str1+="0101";break;
    case '6':str1+="0110";break;
    case '7':str1+="0111";break;
    case '8':str1+="1000";break;
    case '9':str1+="1001";break;
    case 'A':str1+="1010";break;
    case 'B':str1+="1011";break;
    case 'C':str1+="1100";break;
    case 'D':str1+="1101";break;
    case 'E':str1+="1110";break;
    case 'F':str1+="1111";break;
    default:break; 
   }
  }
  //以下循环转8进制 
  for(i=0;i<4;i++){  //因为有12位二进制数,所以会有4个8进制数 
     str2="";
     for(j=i*3;j<i*3+3;j++){//每三个二进制提取出来通过判断转为对应8进制数 
        str2=str2+str1[j];
      }
     if(str2=="000")str3+='0';
     if(str2=="001")str3+='1';
     if(str2=="010")str3+='2';
     if(str2=="011")str3+='3';
     if(str2=="100")str3+='4';
     if(str2=="101")str3+='5';
     if(str2=="110")str3+='6';
     if(str2=="111")str3+='7';
   }
 }
 for(i=0;i<3;i++)
  if(str3[0]=='0') str3=str3.erase(0,1); //删除为0的首字符 
 cout<<str3<<endl;
}

你可能感兴趣的:(给定n个十六进制正整数,输出它们对应的八进制数)