蓝桥杯之十六进制转八进制极度简化版(c++代码实现)

上文链接:蓝桥杯之圆的面积(c++实现)

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。

样例输入

2
39
123ABC

样例输出

71
4435274

【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。

代码展示

#include <iostream>

#include <string>  
using namespace std;  

int main()  
{  
   int n = 0, i = 0, j = 0, temp = 0, count = 0;  
   string hexmodel[] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; 
   string hex[10]; //十六进制 
   string bin[10]; //二进制 
   string oct[10]; //八进制 

   //输入十六进制数 
   cin>>n;  
   for (i = 0; i < n; ++i)  
   {  
       cin>>hex[i];  
   }  

   //十六进制转换二进制  
   for (i = 0; i < n; ++i)  
   {  
       j = 0;  
       while (hex[i][j])  
       {  
       		//判断是否为A-F,是则匹配hexmodel对应10-15位置,否则匹配对应0-9位置 
           if(hex[i][j]-'A'>=0&&hex[i][j]-'A'<=5) bin[i]+=hexmodel[(hex[i][j]-'A')+10];
           else bin[i]+=hexmodel[(hex[i][j]-'0')]; 
           ++j;  
       }  
   }  

   //二进制转换为八进制  
   for (i = 0; i < n; ++i)  
   {  
       j = bin[i].size()-1;//获取二进制的字符长度  
       
       while (bin[i][j] && j>=0)  
       {  
           temp = 3;//设定十六进制中每三位为八进制的一位数  
           count = 0;//初始化八进制的一位数为0 
     		//十六进制数中每三位 
           while (temp-- && j>=0)  
           {  
               if ('1' == bin[i][j])  
               {  
                   switch(temp)  
                   {  
                   case 0: count += 4; break;  
                   case 1: count += 2; break;  
                   case 2: count += 1; break;  
                   default:break;  
                   }  
               }  
               --j;  
           }  
           oct[i] += (count+'0');  
       }  
   } 
    
   //打印  
   for (i = 0; i < n; ++i)  
   {  
       j = oct[i].size()-1;  
       while (oct[i][j] == '0')j--;//跳过最高位的0  
       for(;j>=0;j--)
       {
       	  cout<<oct[i][j]-'0';  	
	   } 
       cout<<endl;  
   }  
   return 0;  
}  

该算法之我的总结

  • 利用modelhex自定义数组进行十六进制转换二进制的匹配,节省匹配时间
  • 十六进制转八进制时,注意到十六进制字符长度为4的倍数,八进制字符长度为3的倍数。所以采用对十六进制的每一位数判断并每三位累加,不足三位时利用temp计数变量判断剩余位并进行赋值运算。
  • 应注意到十六进制转二进制,二进制到八进制的过程中,最高位与最低位的变化。

下文链接:蓝桥杯之十六进制与十进制互转简化(c++代码实现)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

河南-殷志强

希望我的文章能帮助到你

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

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

打赏作者

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

抵扣说明:

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

余额充值