问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
刚开始做这道题只是按了一般的思路——> 16 转换成 10 ——>转换成 8
然而 WA。。。。。原因是 16进制这个数特别特别大,注意!!!!!!(十六进制长度不超过100000)
如果转换成 十进制的话,,,肯定更大了……果然……我不WA谁WA。。。。
后来再想一想 十六进制 与 八进制 转换不仅只有十进制一种方法,还有 二进制啊。
十六进制的每一位转换成 四位的 二进制 ,然后 二进制 每三位转换成 八进制……ok,,
队列,栈真是个好东西,还好我会。一顿模拟。。。。ε=(´ο`*)))唉,,也算是过了
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <string>
#include <cmath>
#include <vector>
#define Max 101
#define ll long long
using namespace std;
int main() {
int t;
string s;
cin>>t;
while(t--) {
cin>>s;
queue<int> q;
while(!q.empty()) q.pop();
for(int i=0; i<s.length(); i++) {
stack<int> st;
if(s[i]>='0'&&s[i]<='9') {
int cnt=0;
while(!st.empty()) st.pop();
int temp=s[i]-'0';
while(temp) {
int t=temp%2;
temp=temp/2;
st.push(t);
cnt++;
}
//cout<<"*** :"<<cnt<<endl;
while(cnt!=4) {
st.push(0);
cnt++;
}
//cout<<"***** :"<<cnt<<endl;
}
if(s[i]>='A'&&s[i]<='F') {
int temp=s[i]-'A'+10;
while(!st.empty()) st.pop();
int cnt=0;
while(temp) {
int t=temp%2;
temp=temp/2;
st.push(t);
cnt++;
}
//凑够四位
while(cnt!=4) {
st.push(0);
cnt++;
}
}
while(!st.empty()) {
q.push(st.top());
st.pop();
}
// while(!q.empty())
// {
// cout<<q.front()<<endl;
// q.pop();
// }
}
stack<int > s,ss;
while(!ss.empty()) ss.pop();
while(!s.empty()) s.pop();
while(!q.empty())
{
s.push(q.front());
q.pop();
}
while(!s.empty())
{
int sum=0;
for(int i=0;i<3;i++)
{
if(!s.empty())
{
int c=s.top();
sum+=c*pow(2,i);
s.pop();
}
}ss.push(sum);
}
int flag=0;
while(!ss.empty())
{
if(ss.top()!=0) flag=1;
if(flag)
{
cout<<ss.top();
}
ss.pop();
}
cout<<endl;
}return 0;
}