题目链接:http://lx.lanqiao.org/problem.page?gpid=T51
思路:
将16进制转成2进制,再转成8进制。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define MAXN 100000
char str[MAXN+10]; //16进制存储数组
int str_2[4*MAXN+10]; //2进制存储数组
char str_8[2*MAXN+10]; //8进制存储数组
int main(){
int i, j;
int T;
scanf("%d", &T);
while(T--){
scanf("%s", str);
int len = strlen(str);
for(i=len-1, j=0; str[i]; --i){ //将16进制转成2进制
int n;
if(str[i]>='0'&&str[i]<='9') n = str[i] - '0';
else n = str[i] - 'A' + 10;
do{
str_2[j++] = n&1;
n = n>>1;
}while(j%4!=0);
}
len = j; //将2进制转换为8进制
int num;
j = 0;
if(len%3 == 2){
str_8[j++] = str_2[len-1]*2+str_2[len-2]+'0';
len -= 2;
}
else if(len%3 == 1){
str_8[j++] = str_2[len-1] + '0';
len -= 1;
}
for(i = len-1; i>=0; i-=3, j++){
str_8[j] = str_2[i]*4+str_2[i-1]*2+str_2[i-2]+'0';
}
str_8[j]='\0';
int i = 0;
while(str_8[i]=='0') ++i; //去除开头的0
for(;str_8[i];++i)
printf("%c", str_8[i]);
printf("\n");
}
return 0;
}