问题描述
给定n个十六进制正整数,输出它们对应的八进制数。输入格式
输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
239
123ABC
样例输出
714435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码:
// 分析:因为直接成转换字符串不好相加,故将十六进制的每1位转换成4位二进制
// 再判断所有的二进制是否是3的倍数,如果是,直接转换输出,否则先补齐再输出
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int main(void)
{
int n;
scanf("%d",&n);
getchar();
while(n --)
{
string num;
char a;
a = getchar();
while(a != '\n')
{
switch(a)
{
case '0': num += "0000";break;
case '1': num += "0001";break;
case '2': num += "0010";break;
case '3': num += "0011";break;
case '4': num += "0100";break;
case '5': num += "0101";break;
case '6': num += "0110";break;
case '7': num += "0111";break;
case '8': num += "1000";break;
case '9': num += "1001";break;
case 'A': num += "1010";break;
case 'B': num += "1011";break;
case 'C': num += "1100";break;
case 'D': num += "1101";break;
case 'E': num += "1110";break;
case 'F': num += "1111";break;
}
a = getchar();
}
int len = num.length();
int inc = len % 3 == 0?0:( ( (len+1)% 3 == 0)?1:2);
if(inc == 2 && num[0]-'0') printf("%d", num[0]-'0');
else if(inc == 1 && (num[0]+num[1]-2*'0')) printf("%d", num[0]*2+num[1]-3*'0');
else if(inc == 0 && (num[0]+num[1]+num[2]-3*'0')) printf("%d", (num[0]-'0')*4 + (num[1]-'0')*2 + num[2] - '0');
for(int i = 3-inc; i < len; i+=3)
{
printf("%d", num[i]*4+num[i+1]*2+num[i+2]-7*'0');
}
printf("\n");
}
return 0;
}