基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
39
123ABC
样例输出
71
4435274
题目分析:先转2进制,再转8进制
4435274
题目分析:先转2进制,再转8进制
#include <cstdio>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int out[1000005];
int main()
{
int n;
scanf("%d", &n);
while(n--)
{
string s, ans;
cin >> s;
if(s[0] == '0')
{
printf("0\n");
continue;
}
int len = s.length();
for(int i = len - 1; i >= 0; i--)
{
if(s[i] == '0')
ans += "0000";
else if(s[i] == '1')
ans += "1000";
else if(s[i] == '2')
ans += "0100";
else if(s[i] == '3')
ans += "1100";
else if(s[i] == '4')
ans += "0010";
else if(s[i] == '5')
ans += "1010";
else if(s[i] == '6')
ans += "0110";
else if(s[i] == '7')
ans += "1110";
else if(s[i] == '8')
ans += "0001";
else if(s[i] == '9')
ans += "1001";
else if(s[i] == 'A')
ans += "0101";
else if(s[i] == 'B')
ans += "1101";
else if(s[i] == 'C')
ans += "0011";
else if(s[i] == 'D')
ans += "1011";
else if(s[i] == 'E')
ans += "0111";
else if(s[i] == 'F')
ans += "1111";
}
len = ans.length();
if(len % 3 == 1)
{
len += 2;
ans += "00";
}
else if(len % 3 == 2)
{
len += 1;
ans += "0";
}
int cnt = 0;
for(int i = 0; i < len; i += 3)
out[cnt ++] = (ans[i] - '0') + (ans[i + 1] - '0') * 2 + (ans[i + 2] - '0') * 4;
bool flag = false;
for(int i = cnt - 1; i >= 0; i--)
{
if(out[i] == 0 && !flag)
continue;
flag = true;
printf("%d", out[i]);
}
printf("\n");
}
}