基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定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
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:十六进制->二进制->八进制
遇到的坑:1.没有考虑到当十六进制数是0时,哇,必须特殊判断,若flag=0,即都是0时,结果是0;2.数组越界情况 3.剩余二进制数的判断
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
char str[500005],str1[500005],str2[500005];//数组越界情况
int main()
{
int n;
int num,len;
scanf("%d",&n);
while(n--){
scanf("%s",str);
len=strlen(str);
int len1=0;
for(int i=0;i<len;i++){
if(str[i]=='0'){//若为0,转换成二进制为:0000
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='0';
}else if(str[i]=='1'){
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='1';
}else if(str[i]=='2'){
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='0';
//str1=str1+"0010";
}else if(str[i]=='3'){
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='1';
//str1+="0011";
}else if(str[i]=='4'){
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='0';
// str1+="0100";
}else if(str[i]=='5'){
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='1';
// str1+="0101";
}else if(str[i]=='6'){
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='0';
// str1+="0110";
}else if(str[i]=='7'){
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='1';
// str1+="0111";
}else if(str[i]=='8'){
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='0';
//str1+="1000";
}else if(str[i]=='9'){
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='0';
str1[len1++]='1';
// str1+="1001";
}else if(str[i]=='A'){
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='0';
// str1+="1010";
}else if(str[i]=='B'){
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='1';
str1[len1++]='1';
// str1+="1011";
}else if(str[i]=='C'){
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='0';
// str1+="1100";
}else if(str[i]=='D'){
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='0';
str1[len1++]='1';
// str1+="1101";
}else if(str[i]=='E'){
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='0';
// str1+="1110";
}else if(str[i]=='F'){
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='1';
str1[len1++]='1';
// str1+="1111";
}
}
int len2=0,i;
for(i=len1-1;i>=2;i=i-3){//i==2也满足条件
if(str1[i-2]=='0'&&str1[i-1]=='0'&&str1[i]=='1'){
str2[len2++]='1';
} else if(str1[i-2]=='0'&&str1[i-1]=='1'&&str1[i]=='0'){
str2[len2++]='2';
} else if(str1[i-2]=='0'&&str1[i-1]=='1'&&str1[i]=='1'){
str2[len2++]='3';
} else if(str1[i-2]=='1'&&str1[i-1]=='0'&&str1[i]=='0'){
str2[len2++]='4';
} else if(str1[i-2]=='1'&&str1[i-1]=='0'&&str1[i]=='1'){
str2[len2++]='5';
} else if(str1[i-2]=='1'&&str1[i-1]=='1'&&str1[i]=='0'){
str2[len2++]='6';
} else if(str1[i-2]=='1'&&str1[i-1]=='1'&&str1[i]=='1'){
str2[len2++]='7';
}else if(str1[i-2]=='0'&&str1[i-1]=='0'&&str1[i]=='0'){
str2[len2++]='0';
}
}
if(i==0){//i=3后跳出的,即还剩下0没判断
if(str1[0]=='0'){
str2[len2++]='0';
}else{
str2[len2++]='1';
}
} else if(i==1){//i==4时跳出的,还有1,0没判断
if(str1[1]=='1'&&str1[0]=='0'){
str2[len2++]='1';
}else if(str1[1]=='0'&&str1[0]=='1'){
str2[len2++]='2';
}else if(str1[1]=='1'&&str1[0]=='1'){
str2[len2++]='3';
}
}
int flag=0;
for(int i=len2-1;i>=0;i--){
if(str2[i]=='0'&&!flag){
continue;
}
printf("%c",str2[i]);
flag=1;
}
if(flag==0){
cout<<"0";
}
printf("\n");
}
return 0;
}