0
点赞
收藏
分享

微信扫一扫

十六进制转八进制(大数思路模拟)


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

 

举报

相关推荐

0 条评论