蓝桥杯基础练习
时间限制:1ms 内存限制:512MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:十六进制转换成二进制,再由二进制转换为八进制。
#include <iostream>
#include <string>
using namespace std;
string hex2bi(char x){
int y;
if(x>='0'&&x<='9'){
y=x-'0';
}else{
y=x-'A'+10;
}
string s="";
int t=4;
while(t--){
s=char(y%2+'0')+s;
y/=2;
}
return s;
}
char bi2oct(string bi){
int x=0;
for(int i=0;i<3;i++){
x<<=1;
x+=bi[i]-'0';
}
return x+'0';
}
string hex2oct(string hex){
string s="",ss="";
long t=hex.length()-1;
while(t>=0){
ss=hex2bi(hex[t])+ss;
while(ss.length()>3){
s=bi2oct(ss.substr(ss.length()-3,3))+s;
ss=ss.substr(0,ss.length()-3);
}
t--;
}
if(ss.length()>0){
while(ss.length()<3)
ss='0'+ss;
s=bi2oct(ss)+s;
}
t=0;
while(s[0]=='0'&&s.length()>1){
s=s.substr(1,s.length()-1);
}
return s;
}
int main(){
int n;
string s;
cin>>n;
while(n--){
cin>>s;
cout<<hex2oct(s)<<endl;
}
return 0;
}