题目链接:http://lx.lanqiao.cn/problem.page?gpid=T51
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
正如提示所说,我们先将十六进制转换成二进制,然后再将二进制转换成八进制。具体的进制转换规则可以看这篇博客:
https://mp.csdn.net/postedit/86816757
具体的解释见代码注释。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char a[100005],b[400005],c[400005];
int main()
{
int n;
scanf("%d",&n);
while(n--){
scanf("%s",a);
int l=strlen(a);
int t,len=0;
for(int i=l-1;i>=0;i--){ //十六进制转二进制
if(a[i]<='F'&&a[i]>='A')
t=a[i]-'A'+10;
else
t=a[i]-'0';
for(int j=0;j<4;j++){ //这里是将一位十六进制数t用除2取余法得到4位二进制数
b[len++]=t%2+'0'; //for循环控制能够得到4位,t得到的不一定是4位,不足时就要补0
t/=2;
}
}
b[len]='\0'; //方便输出得到的二进制数
int len1=0;
for(int i=0;i<len;){ //二进制数转八进制
int m=0;
for(int k=0;k<3;k++){ 每3位二进制数以按权相加的方法得到一位八进制数
if(i<len)
m+=(b[i]-'0')*pow(2.0,k);
else
m+=0;
if(i<len) //当剩余的二进制数不足3位时,就要在最左边补0
i++;
}
c[len1]=m+'0';
len1++;
}
int j=len1-1;
while(j>=0&&c[j]=='0'){ //去除前导0,即得到的八进制数最左边多余的0
j--;
}
for(int i=j;i>=0;i--)
printf("%c",c[i]); //输出得到的八进制数
printf("\n");
}
return 0;
}