问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
代码实现:
#include
#include
int main()
{
char arr[9] = { 0 };
int i = 0;
unsigned int b = 0;
int n = 1;
scanf("%s", arr);
for (i = strlen(arr) - 1; i >= 0; i--)
{
if (arr[i] <= '9')
{
b += (arr[i] - '0') * n;
}
else
{
b += (arr[i] - 'A' + 10) * n;
}
n *= 16;
}
printf("%u\n", b);
return 0;
}
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0 ~ 9、大写字母A ~ F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码实现:
#include
#include
#include
#define MaxSize 100000
void saveB(char* a2, char c1, char c2, char c3, char c4, int start)
{
a2[start] = c1;
a2[start + 1] = c2;
a2[start + 2] = c3;
a2[start + 3] = c4;
}
int btran(char* a1, char* a2)
{
int i = 0;
int j = 0;
int h1 = strlen(a1);
for (i = 0; i < h1; i++)
{
switch (a1[i])
{
case'0':
{
saveB(a2, '0', '0', '0', '0', 4 * i);
break;
}
case'1':
{
saveB(a2, '0', '0', '0', '1', 4 * i);
break;
}
case'2':
{
saveB(a2, '0', '0', '1', '0', 4 * i);
break;
}
case'3':
{
saveB(a2, '0', '0', '1', '1', 4 * i);
break;
}
case'4':
{
saveB(a2, '0', '1', '0', '0', 4 * i);
break;
}
case'5':
{
saveB(a2, '0', '1', '0', '1', 4 * i);
break;
}
case'6':
{
saveB(a2, '0', '1', '1', '0', 4 * i);
break;
}
case'7':
{
saveB(a2, '0', '1', '1', '1', 4 * i);
break;
}
case'8':
{
saveB(a2, '1', '0', '0', '0', 4 * i);
break;
}
case'9':
{
saveB(a2, '1', '0', '0', '1', 4 * i);
break;
}
case'A':
{
saveB(a2, '1', '0', '1', '0', 4 * i);
break;
}
case'B':
{
saveB(a2, '1', '0', '1', '1', 4 * i);
break;
}
case'C':
{
saveB(a2, '1', '1', '0', '0', 4 * i);
break;
}
case'D':
{
saveB(a2, '1', '1', '0', '1', 4 * i);
break;
}
case'E':
{
saveB(a2, '1', '1', '1', '0', 4 * i);
break;
}
case'F':
{
saveB(a2, '1', '1', '1', '1', 4 * i);
break;
}
default:
break;
}
}
return 4 * h1;
}
int otran(char* a2, char* a3, int bl)
{
int i = 0;
int j = 0;
int ol = 0;
if (bl % 3 == 0)
{
ol = bl / 3;
}
else
{
ol = bl / 3 + 1;
}
j = bl - 1;
for (i = ol - 1; i >= 0; i--)
{
if (i > 0)
{
a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + (a2[j - 2] - 48) * 4 + 48;
}
else
{
switch (j)
{
case 2:
a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + (a2[j - 2] - 48) * 4 + 48;
break;
case 1:
a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + 48;
break;
case 0:
a3[i] = a2[j];
break;
default:
break;
}
}
j = j - 3;
}
return ol;
}
void print(char* a3, int ol)
{
int i = 0;
if (a3[0] == '0')
{
i = 1;
}
for (; i < ol; i++)
{
printf("%c", a3[i]);
}
printf("\n");
}
int main()
{
char arr1[MaxSize];
char arr2[4 * MaxSize];
char arr3[4 * MaxSize];
int n = 0;
int i = 0;
int bl = 0;
int ol = 0;
scanf("%d", &n);
getchar();
for (i = 0; i < n; i++)
{
gets(arr1);
bl = btran(arr1, arr2);
ol = otran(arr2, arr3, bl);
print(arr3, ol);
}
return 0;
}