蓝桥杯 基础练习 十六进制转八进制 C语言 高效方式 解决超时问题
大家好,这是我第一次书写自己的博客,非常开心你能够阅读这篇文章,希望接下来的内容对你有所帮助。
正文(完整可用代码见文末)
基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
该题的解题思路
该题的解题思路很清晰,即将16进制数字转换为2进制,然后将2进制数字转换为8进制。我相信点进来的同学应该已经对本题有所了解,甚至已经有了可以执行的程序,但是在放入蓝桥杯官网中提交执行时显示超时错误,所以本文主要对本题 超时的解决方案进行分析。
超时问题解决思路
为了解决上述超时问题,我们可以思考一种方法,即只需要一次或少次判断就可以将十六进制数字转换为四位二进制数。那么该如何去做呢?
大家知道,
0 ···9
,
A ···F
对应的ASCII值是确定的,那么是否可以建立这么一个数组,将对应16个16进制数的二进制形态保存下来,通过十六进制数的ASCII值来检索呢?答案是肯定的。首先我们建立如下数组
char demo[16][4] = {
"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
数组demo
存储了十六进制数字0 ···F
对应的二进制形式,0 ··· F
的二进制形式在数组中的索引值分别为demo[i]
,i = 0,1,2,...,16
;。为了将0 ··· F
能够与0
至16
的数值对应,可以采取如下方式:
for(j=0;j<str_len;j++)
{
if(str[i][j]<65){
temp[k++] = demo[str[i][j]-48][0];
temp[k++] = demo[str[i][j]-48][1];
temp[k++] = demo[str[i][j]-48][2];
temp[k++] = demo[str[i][j]-48]