蓝桥杯:基础练习 十六进制转八进制(堆栈实现数制转换)

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

注释非常详细,适合新手看,代码有很多不足,我也在学习中。


#include<iostream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stack>  //堆栈
#include<queue> //队列
using namespace std;
int main(){
 int  n;
 cin>>n;
 string six;//注意字符串的操作
 stack<int>s,s2;
 int zhi;//十六进制对应的十进制数  比如F相当于zhi=15
 while(n--){
  cin>>six;
  for(int i=0;i<six.size();i++){
   if(six[i]>='A'&&six[i]<='F')
    zhi=six[i]-55;//if -else 用来求出十六进制数对应的十进制数是zhi
   else
    zhi=six[i]-'0';
   int a[4]={0};//用来存放四位二进制数
   
   //转二进制
   for(int i=3;i>=0;i--){//将十六进制转换成二进制放入堆栈中,但要保证有四位,不足用0补齐
    a[i]=zhi%2;
    zhi/=2;}
   for(int i=0;i<4;i++){
    s.push(a[i]);
   }
  }//到此为止将一个完整的十六进制字符串放入了堆栈中,接下来按照每三位一取,将其化为八进制

  /*while(!s.empty()){    //这里注释的部分是用来注释代码,检验二进制以及之前的操作是否正确
   cout<<s.top();
  s.pop();}
}
return 0;
}*/
  //转八位
  while(!s.empty()){
  int b[4]={0};//存放堆栈里弹出来的三位二进制数
  for(int i=0;i<3;i++){
   if(s.empty())//一定要检查是否为空栈,否则会出deque iterator not dereferencable错误
    break;
   b[i]=s.top();
   s.pop();}
  s2.push(b[0]+b[1]*2+b[2]*4);}//这里已经将一个十六进制数换换成了八进制数并存入了堆栈中
    
  //输出
  while(!s2.top())
   s2.pop();//去掉首位的0
  while(!s2.empty()){
cout<<s2.top();
s2.pop();
  }//这里完整做完一个十六进制转换成八进制数并将其输出的工作
  cout<<endl;
 }//这里对应第一个while,用来完成多个十六进制数的转换工作并输出
 return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38176757/article/details/80286309