问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
using namespace std;
char S[100100];
int T[400400];
int E[200200];
int main()
{
int n, i, l, term=0, temp=0;
scanf("%d",&n);
while(n--)
{
term=2;
temp=0;
memset(S,'\0',sizeof(S));
memset(T,0,sizeof(T));
memset(E,0,sizeof(E));
scanf("%s",S);
l=strlen(S);
for(i=0;i<l;i++)
switch(S[i])
{
case '0':{T[term++]=0;T[term++]=0;T[term++]=0;T[term++]=0;}break;
case '1':{T[term++]=0;T[term++]=0;T[term++]=0;T[term++]=1;}break;
case '2':{T[term++]=0;T[term++]=0;T[term++]=1;T[term++]=0;}break;
case '3':{T[term++]=0;T[term++]=0;T[term++]=1;T[term++]=1;}break;
case '4':{T[term++]=0;T[term++]=1;T[term++]=0;T[term++]=0;}break;
case '5':{T[term++]=0;T[term++]=1;T[term++]=0;T[term++]=1;}break;
case '6':{T[term++]=0;T[term++]=1;T[term++]=1;T[term++]=0;}break;
case '7':{T[term++]=0;T[term++]=1;T[term++]=1;T[term++]=1;}break;
case '8':{T[term++]=1;T[term++]=0;T[term++]=0;T[term++]=0;}break;
case '9':{T[term++]=1;T[term++]=0;T[term++]=0;T[term++]=1;}break;
case 'A':{T[term++]=1;T[term++]=0;T[term++]=1;T[term++]=0;}break;
case 'B':{T[term++]=1;T[term++]=0;T[term++]=1;T[term++]=1;}break;
case 'C':{T[term++]=1;T[term++]=1;T[term++]=0;T[term++]=0;}break;
case 'D':{T[term++]=1;T[term++]=1;T[term++]=0;T[term++]=1;}break;
case 'E':{T[term++]=1;T[term++]=1;T[term++]=1;T[term++]=0;}break;
case 'F':{T[term++]=1;T[term++]=1;T[term++]=1;T[term++]=1;}break;
}
term--;
for(i=term;i>=2;i-=3)
E[temp++]=T[i]*1+T[i-1]*2+T[i-2]*4;
for(i=temp-1;i>=0;i--)
{
if((i==temp-1)&&E[i]==0)continue;
printf("%d",E[i]);
}
printf("\n");
}
return 0;
}
题意很清晰了,就是16进制转8进制,循环输入,然后提示也给了转化方法,但数据比较大所以改用数组存储,理论上用整型数组解决比较容易,但16进制数带有字母所以存16进制的还是用字符型数组,然后转化成2进制以及2进制转化成8进制都可以用整型,这样比较好处理,详见代码。还有一点就是2进制转化8进制时的前导零问题,可以在结尾时判断一下,我比较懒就直接在转存2进制时直接从数组的2号位开始存,这样就无论是否数组有前导零都不会担心访问出界,(虽然结尾还是用了一个if判断前端是否均为零.......)所以整体代码写的并不是很完善,而且写的也很丑,所以仅供参考吧。。。