资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<iostream>
#include<math.h>
#include<string>
//每个十六进制数长度不超过100000
//输出的八进制数不能有前导0
using namespace std;
string sixteen_to_two(string a){
string h[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string ans="";
for(int i=0;i<a.length();i++){
if(a[i]-'0'<10){
ans+=h[a[i]-'0'];
}else{
//输入的十六进制没有小写字母,为大写字母
ans+=h[a[i]-'A'+10];
}
}
return ans;
}
string two_to_eight(string a){
string ans="";
int len=a.length();
if(len%3!=0){
//前面补0
int cnt=3-len%3;
while(cnt--){
a='0'+a;
}
}
for(int i=0;i<len;i+=3){
// ans+=u_map[a.substr(i,3)];
if(a.substr(i,3)=="000"){
ans+="0";
}else if(a.substr(i,3)=="001"){
ans+="1";
}else if(a.substr(i,3)=="010"){
ans+="2";
}else if(a.substr(i,3)=="011"){
ans+="3";
}else if(a.substr(i,3)=="100"){
ans+="4";
}else if(a.substr(i,3)=="101"){
ans+="5";
}else if(a.substr(i,3)=="110"){
ans+="6";
}else if(a.substr(i,3)=="111"){
ans+="7";
}
}
//去0
int i=0;
while(ans[i++]=='0'&&ans.length()!=0){
ans=ans.substr(i);
}
return ans;
}
int main(){
int n;
scanf("%d",&n);
string a;
for(int i=0;i<n;i++){
cin>>a;
cout<<two_to_eight(sixteen_to_two(a))<<endl;
}
return 0;
}
注意:
1、每个十六进制长度不超过10000,因此最大数的十进制为16^10000-1即2^40000-1,大于long long int的最大取值范围2^64-1,因此不能16进制——10进制——8进制。
2、输出的8进制不能有前导0
3、输出的答案记得换行