蓝桥杯之十六进制转八进制极度简化版(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++代码实现)

发布了30 篇原创文章 · 获赞 3 · 访问量 2776

猜你喜欢

转载自blog.csdn.net/weixin_44077556/article/details/104208972