蓝桥杯 16进制转8进制

##十万位16进制转8进制
一、概述:

	在蓝桥杯的练习系统解决了一道题————16进制转八进制,
	乍一看感觉很简单,
	然而提交后显示错误好几遍后才知道它的测试数据里有一个十万位的16进制数,
											晕...*—*|||

二、主要思路:

根据3个十六进制为与4个八进制位一一对应的关系
将目标字符串每三个字符一组,转成十进制
再直接用c语言自带的输出八进制位一一输出
每个字符串处理完后记得换行

三、代码实现:

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_ARRNUM 10
#define MAX_XNUM 100001

void XToO(char* strX)
{
	int i, j, xtime;
	int len = strlen(strX);
	for(i = len%3 - 3; i < len; i+=3)
	{
		int sum = 0, count;
		for(count = 0; count < 3; count++)
		{
			if((*(strX + i + count) >='0') && (*(strX + i + count) <='9'))
				sum += (int)pow(16, 2 - count)*(*(strX+ i + count) -'0');
			else if((*(strX + i + count) >='A') && (*(strX + i + count) <='F'))
				sum += (int)pow(16, 2 - count)*(*(strX+ i + count) -'A' + 10);
		}
		if(i <= 0)
		{
			if(sum == 0) continue;
			printf("%o", sum); 
		}
		else
			printf("%04o", sum);
	}
	printf("\n");
	return;
}
int main()
{
	int num, i;
	char str[MAX_ARRNUM+1][MAX_XNUM];
	scanf("%d", &num);
	for(i = 1; i <= num; i++)
		scanf("%s", &str[i]);
	
	for(i = 1; i <= num; i++)
		XToO(str[i]);
	
	return 0;
}

四、运行结果
这里写图片描述

### 蓝桥杯 C语言 进制换 示例代码与解题思路 #### 示例代码:十六进制进制 以下是基于引用中的方法实现的一个完整的C语言程序,用于将十六进制字符串换为十进制数值: ```c #include <stdio.h> #include <string.h> int main() { char hexStr[100001]; scanf("%s", hexStr); int length = strlen(hexStr); long long decimalValue = 0; for (int i = 0; i < length; ++i) { if (hexStr[i] >= '0' && hexStr[i] <= '9') { decimalValue = decimalValue * 16 + (hexStr[i] - '0'); } else if (hexStr[i] >= 'A' && hexStr[i] <= 'F') { decimalValue = decimalValue * 16 + (10 + (hexStr[i] - 'A')); } } printf("%lld\n", decimalValue); return 0; } ``` 上述代码实现了从标准输入读取一个十六进制字符串并将其化为对应的十进制值[^1]。 --- #### 示例代码:十六进制八进制 对于更复杂的场景,比如将十六进制换为八进制数,则可以分两步完成:先将十六进制为十进制数,再将该十进制八进制数。以下是一个可能的实现方式: ```c #include <stdio.h> #include <string.h> void convertDecimalToOctal(long long dec, char octal[]) { int index = 0; while (dec != 0) { octal[index++] = (dec % 8) + '0'; dec /= 8; } octal[index] = '\0'; // Reverse the string to get correct order. for(int start = 0, end = index - 1; start < end; ++start, --end){ char temp = octal[start]; octal[start] = octal[end]; octal[end] = temp; } } int main() { char hexStr[100001], octalResult[300001]; scanf("%s", hexStr); int length = strlen(hexStr); long long decimalValue = 0; for (int i = 0; i < length; ++i) { if (hexStr[i] >= '0' && hexStr[i] <= '9') { decimalValue = decimalValue * 16 + (hexStr[i] - '0'); } else if (hexStr[i] >= 'A' && hexStr[i] <= 'F') { decimalValue = decimalValue * 16 + (10 + (hexStr[i] - 'A')); } } convertDecimalToOctal(decimalValue, octalResult); printf("%s\n", octalResult ? octalResult : "0"); return 0; } ``` 此代码通过中间变量存储十进制值,并最终输出其八进制形式[^3]。 --- #### 解题思路分析 在处理大规模数据时需要注意以下几个方面: - **防止溢出**:由于题目中提到的数据规模较大(最长可达十万位),因此需要考虑使用`long long`甚至更高精度的数据结构来保存计算结果。 - **优化性能**:如果涉及多次重复操作,可以通过预处理减少冗余运算。例如,在多组测试样例的情况下,初始化阶段可采用快速I/O设置以提升效率[^2]。 - **边界条件**:务必验证极端情况下的表现,如全零串、最大允许范围内的合法输入等。 此外,为了简化逻辑复杂度,通常建议按照如下流程设计算法: 1. 将原始X进制表示解析为其对应的实际数值; 2. 对得到的结果执行必要的后续变换(如有必要); 3. 输出目标Y进制的形式作为最后答案[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值