基础练习 十六进制转八进制
时间限制: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
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char s1[990000], s2[990000], s3[990000], s4[990000];
string getT(char c) {
string s;
switch(c) {
case '0': s = "0000";break;
case '1': s = "0001";break;
case '2': s = "0010";break;
case '3': s = "0011";break;
case '4': s = "0100";break;
case '5': s = "0101";break;
case '6': s = "0110";break;
case '7': s = "0111";break;
case '8': s = "1000";break;
case '9': s = "1001";break;
case 'A': s = "1010";break;
case 'B': s = "1011";break;
case 'C': s = "1100";break;
case 'D': s = "1101";break;
case 'E': s = "1110";break;
case 'F': s = "1111";break;
}
return s;
}
char getE(char *a) {
char s;
if (a[0] == '0' && a[1] == '0' && a[2] == '0') s = '0';
else if (a[0] == '0' && a[1] == '0' && a[2] == '1') s = '1';
else if (a[0] == '0' && a[1] == '1' && a[2] == '0') s = '2';
else if (a[0] == '0' && a[1] == '1' && a[2] == '1') s = '3';
else if (a[0] == '1' && a[1] == '0' && a[2] == '0') s = '4';
else if (a[0] == '1' && a[1] == '0' && a[2] == '1') s = '5';
else if (a[0] == '1' && a[1] == '1' && a[2] == '0') s = '6';
else if (a[0] == '1' && a[1] == '1' && a[2] == '1') s = '7';
return s;
}
int getTwo(char *s1) {
char ss[5];
int k = 2;
int len = strlen(s1);
for (int i = 0; i < len; i++) {
string n1 = getT(s1[i]);
for (int j = k, x = 0; x < 4; j++,x++) {
s2[j] = n1[x];
}
k += 4;
}
return k;
}
int main() {
int n, len3, len4;
scanf("%d", &n);
while(n--) {
scanf("%s", s1);
len3 = 2, len4 = 0;
int len5 = 0;
int len = getTwo(s1);
int index = 0;
for (int i = 2; i < len; i++) {
if (s2[i] != '0') {
index = i;
break;
}
}
for (int i = index; i < len; i++) {
len5++;
s3[len3++] = s2[i];
}
int m = len5%3;
int index1 = 3-m;
if (index1 == 2) {
s3[0] = '0';s3[1] = '0';
index = 0;
} else if (index1 == 1) {
s3[1] = '0';
index = 1;
} else {
index = 2;
}
for (int i = index; i < len3;) {
char ss[3];
ss[0] = s3[i];ss[1] = s3[i+1];ss[2] = s3[i+2];
s3[len4++] = getE(ss);
i += 3;
}
for (int i = 0; i < len4; i++) printf("%c", s3[i]);
puts("");
}
return 0;
}
第二种解法:
#include<cstdio>
#include<math.h>
#include<cstring>
int temp[410000];
char jz16[110000];
int answer[410000];
int switcha(char a)
{
if(a>='0'&&a<='9')
return a-'0';
else
return a-'A'+10;
}
int main()
{
int n;
int len;
int now;
int i,j,k;
int sum;
scanf("%d",&n);
while(n--)
{
scanf("%s",jz16);
len=strlen(jz16);
for(i=0;i<len;i++)
{
now=switcha(jz16[i]);
for(j=(i+1)*4-1;j>=i*4;j--)
{
temp[j]=now%2;
now/=2;
}
}//一个十六进制变成4个二进制顺着来
memset(answer,0,sizeof(answer));
for(i=len*4-1,sum=0;i>=0;i-=3,sum++)
//三个二进制变成一个八进制逆着来
for(j=i,k=0;j>i-3&&j>=0;j--,k++)
answer[sum]+=temp[j]*(int)pow(2,k);
for(i=sum;;i--)
if(answer[i]!=0)
break;
//注意不输出前面多余的0
for(i=i;i>=0;i--)
printf("%d",answer[i]);
printf("\n");
}
return 0;
}