问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示 】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
给定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;
}