16进制转8进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
样例输入
2
39
123ABC
样例输出
71
4435274
提示:本代码不是为了解决蓝桥杯16进制转换8进制的问题,只是为了了解字符串数组的输入,但可以给大家蓝桥杯那个题一个提示,那个题的输入输出数值都过大,可用数组输出(中途转换其他进制当然也用数组),这样就不用考虑类型的取值范围限制
本题关键还是字符串的作为数组输入,我在这儿取了个巧,建了个二维数组,但实质最终还是一样的
#include <stdio.h>
#include<math.h>
#pragma warning(disable:4996)
void scale(char* str)
{
int ten = 0, num = 0, n = 0;
while (str[++num] != '\0') {
;
}
int i = 0;
while (i <= num) {
if (str[i] >= '0' && str[i] <= '9')
{
n = (int)(str[i] - '0');
}
else if (str[i] >= 'a' && str[i] <= 'f')
{
n = (int)(str[i] - 'a' + 10);
}
else if (str[i] >= 'A' && str[i] <= 'F')
{
n = (int)(str[i] - 'A' + 10);
}
else
{
break;
}
ten += n * pow(16, (double)num - 1 - (double)i);
i++;
}
int eight = 0,m=0;
i = 0;
while (ten)
{
m = ten % 8;
ten /= 8;
eight += m * pow(10, i);
i++;
}
printf("%d", eight);
}
int main()
{
int num;
scanf("%d",&num);
char** arr;
arr = (char**)malloc(num * sizeof(char*));
for (int i = 0; i < num; i++)
{
*(arr + i) = (char*)malloc(sizeof(char) * 100);
}
for (int i = 0; i < num; i++)
{
scanf("%s", arr[i]);
}
for (int i = 0; i < num; i++)
{
scale(arr[i]);
}
free(arr);
return 0;
}