【蓝桥杯】十六进制转八进制

本文介绍了一种使用C++实现的十六进制数转换为八进制数的方法。通过将十六进制数首先转换为二进制,再从二进制转换为八进制,实现了精确的数值转换。代码详细展示了如何处理字符串长度不足的情况,并通过循环和条件语句完成了转换过程。
摘要由CSDN通过智能技术生成

十六进制转八进制

描述

#include<iostream>
#include<string>
#include<cstring>//strcat(str1,str2),实现两个字符串的相加,strcmp(str1,str2),比较两个字符串是否相等
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); 
  erase是C++中String类库中提供的一个函数,其作用是将字符串中的特定的连续若干元素删除。括号中两个参数,第一参数表示要删除元素的起始位置,第二个参数表示要删除的个数。
 cout<<str3<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拼搏的小浣熊

你的鼓励是我创作的巨大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值