C++:蓝桥杯练习题~十六进制转八进制

来源:互联网 发布:linux 安装jdk gz文件 编辑:程序博客网 时间:2024/05/18 12:03
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char get_value(const char a)/*将每个字符转化成对应的整数*/
{
 if(a>='A'&&a<='F')
  return (a-'A'+10);
 if(a>='0'&&a<='9')
  return (a-'0');
}
int main()
{
 char input[100000+1],middle[100000*4+4],output[100000*3+3];
 int n,i=0,j=0,k,t;
 cin>>n;
 while(n--)
 {
  cin>>input;/*输出十六进制字符串*/
  k=strlen(input);
  j=0;
  for(i=0;i<k;i++)/*十六进制转二进制*/
  {
   t=get_value(input[i]);
   middle[j++]=((t>>3)&0x1);
   middle[j++]=((t>>2)&0x1);
   middle[j++]=((t>>1)&0x1);
   middle[j++]=((t>>0)&0x1);
  }
 j=k*4-1;
 i=(k*4+2)/3-1;
 output[i+1]='\0';
 for(;j>=0;j-=3)/*二进制转八进制*/
 {
  if(j>=2)
   output[i--]=(middle[j-2]<<2|middle[j-1]<<1|middle[j])+'0';
  else if(j==1)
   output[i--]=(middle[j-1]<<1|middle[j])+'0';
  else if(!j)
   output[i--]=middle[j]+'0';
 }
 j=i+1;
 while(output[j]=='0')j++;/*去除前导的零*/
 if(output[j]=='\0')cout<<"0"<<endl;/*如果整个字符串都是零,那么结果直接输出为0*/
 else printf("%s\n",&output[j]);
 }
 return 0;
}