问题描述
给定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; }