问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
https://ask.csdn.net/questions/715045
这个问题解决了么?如果解决,请点我回答左上角的采纳。谢谢
每个十六进制数长度不超过100000。
我怀疑题目错了,应该是16进制的数不超过100000吧,要是长度的话,这个数字简直是天文数字了。我按照值不超过100000来写。
#include "stdio.h"
#define N 10
int hex2dec(char * hex)
{
int n = 0;
while (*hex != '\0')
{
n *= 16;
if (*hex >= 'A' && *hex <= 'F')
n += (*hex - 'A' + 10);
else
n += (*hex - '0');
hex++;
}
return n;
}
int dec2oct(int n)
{
int r = 0;
int base = 1;
while (n > 0)
{
r += base * (n % 8);
n /= 8;
base *= 10;
}
return r;
}
int main()
{
int n;
int ans[N];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
char hex[10];
scanf("%s", hex);
int n = hex2dec(hex);
ans[i] = dec2oct(n);
}
for (int i = 0; i < n; i++)
{
printf("%d\n", ans[i]);
}
return 0;
}