C语言——字符串数组——16进制转8进制(蓝桥杯 给定n个十六进制正整数,输出它们对应的八进制数。)

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;
}
### 回答1: 可以使用C语言中的scanf函读入n个十六进制正整数,然后使用sprintf函将其换为八进制,最后使用printf函输出即可。具体代码如下: ```c #include <stdio.h> int main() { int n; scanf("%d", &n); while (n--) { char hex[10]; scanf("%s", hex); int dec; sscanf(hex, "%x", &dec); char oct[10]; sprintf(oct, "%o", dec); printf("%s\n", oct); } return 0; } ``` 其中,scanf函用于读入n的值和每个十六进制,sscanf函用于将十六进制换为十进制,sprintf函用于将十进制换为八进制,printf函用于输出八进制。 ### 回答2: 对于这道题目,需要我们先了解一下十六进制八进制之间的换关系。 十六进制每一位对应的二进制是4位,而八进制每一位对应的二进制是3位。因此,将十六进制换为八进制需要将每一个十六进制换为二进制,然后将二进制分成3位一组,再将每一组换为对应八进制。 具体的程序可以按照以下步骤进行设计: 1. 在主函中定义输入n的值和n个十六进制数组。 2. 编写函十六进制换为二进制。可以使用十六进制每一位对应的二进制的表格或者位运算符将一位十六进制换为四位二进制。 3. 编写函将二进制换为八进制。将二进制分成3位一组,计算每一组对应八进制即可。 4. 在主函中循环调用换函输出结果。 以下是程序的代码示例: #include <stdio.h> void hexToBin(char hex[], char bin[]) { int i = 0, j = 0; while (hex[i]) { switch (hex[i]) { case '0': bin[j] = '0'; bin[j+1] = '0'; bin[j+2] = '0'; bin[j+3] = '0'; break; case '1': bin[j] = '0'; bin[j+1] = '0'; bin[j+2] = '0'; bin[j+3] = '1'; break; case '2': bin[j] = '0'; bin[j+1] = '0'; bin[j+2] = '1'; bin[j+3] = '0'; break; case '3': bin[j] = '0'; bin[j+1] = '0'; bin[j+2] = '1'; bin[j+3] = '1'; break; case '4': bin[j] = '0'; bin[j+1] = '1'; bin[j+2] = '0'; bin[j+3] = '0'; break; case '5': bin[j] = '0'; bin[j+1] = '1'; bin[j+2] = '0'; bin[j+3] = '1'; break; case '6': bin[j] = '0'; bin[j+1] = '1'; bin[j+2] = '1'; bin[j+3] = '0'; break; case '7': bin[j] = '0'; bin[j+1] = '1'; bin[j+2] = '1'; bin[j+3] = '1'; break; case '8': bin[j] = '1'; bin[j+1] = '0'; bin[j+2] = '0'; bin[j+3] = '0'; break; case '9': bin[j] = '1'; bin[j+1] = '0'; bin[j+2] = '0'; bin[j+3] = '1'; break; case 'A': bin[j] = '1'; bin[j+1] = '0'; bin[j+2] = '1'; bin[j+3] = '0'; break; case 'B': bin[j] = '1'; bin[j+1] = '0'; bin[j+2] = '1'; bin[j+3] = '1'; break; case 'C': bin[j] = '1'; bin[j+1] = '1'; bin[j+2] = '0'; bin[j+3] = '0'; break; case 'D': bin[j] = '1'; bin[j+1] = '1'; bin[j+2] = '0'; bin[j+3] = '1'; break; case 'E': bin[j] = '1'; bin[j+1] = '1'; bin[j+2] = '1'; bin[j+3] = '0'; break; case 'F': bin[j] = '1'; bin[j+1] = '1'; bin[j+2] = '1'; bin[j+3] = '1'; break; } i++; j += 4; } bin[j] = '\0'; } void binToOct(char bin[], char oct[]) { int len = strlen(bin); int mod = len % 3; int i = 0, j = 0; if (mod == 1) { oct[j] = '0'; j++; oct[j] = '0'; j++; } else if (mod == 2) { oct[j] = '0'; j++; } while (i < len) { int num = 0; if (bin[i] == '1') { num += 4; } if (bin[i+1] == '1') { num += 2; } if (bin[i+2] == '1') { num += 1; } oct[j] = num + '0'; i += 3; j++; } oct[j] = '\0'; } int main() { int n; scanf("%d", &n); char hex[100]; char bin[400]; char oct[200]; for (int i = 0; i < n; i++) { scanf("%s", hex); hexToBin(hex, bin); binToOct(bin, oct); printf("%s\n", oct); } return 0; } 注意在程序中定义的变量类型需要根据实际情况来确定,例如输入的十六进制的长度,需要定义足够长的数组来存储换后的二进制八进制。我们可以根据题目中给出的据范围来确定数组的长度,以保证程序的正确性和可靠性。 ### 回答3: 本题中我们需要将n个十六进制正整数化为对应八进制。因为C语言中,十六进制可以用0x开头表示,八进制可以用0开头表示,所以我们可以先将这n个十六进制正整数化为十进制,再将十进制化为对应八进制。 具体而言,我们可以用C语言的strtoul函十六进制正整数化为对应的十进制。该函的函原型如下: `unsigned long strtoul(const char *nptr, char **endptr, int base);` 其中,第一个参nptr是要换的字符串;第二个参endptr是一个指向char*类型的指针,用来存储换结束后的字符位置;第三个参base表示换的基,对于我们的问题,我们将其设为16即可。 换为十进制后,我们可以采用下面这个函将其化为八进制: ``` void dec2oct(unsigned long num) { if (num == 0) { return; } else { dec2oct(num / 8); printf("%d", num % 8); } } ``` 该函使用递归将十进制化为对应八进制,并输出。整合起来,我们可以写出如下的完整代码: ``` #include <stdio.h> #include <stdlib.h> void dec2oct(unsigned long num) { if (num == 0) { return; } else { dec2oct(num / 8); printf("%d", num % 8); } } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { char str[100]; scanf("%s", str); char *endptr; unsigned long num = strtoul(str, &endptr, 16); dec2oct(num); printf("\n"); } return 0; } ``` 该代码中,我们首先读入n,表示有n个十六进制正整数需要进行换。然后,我们循环n次,每次读入一个字符串,将其化为对应的十进制,再将其化为对应八进制输出。需要注意的是,每个八进制输出后面需要换行。 以上就是在C语言中,将n个十六进制正整数化为八进制的具体实现方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值