问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示

  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

#include<stdio.h>
#include<string.h>void hex2bin(char left[], int count, char ch);
char bin2oct(char left[], int poi);/* 基本思想是将输入的十六进制字符串装入hexs字符数组中,从hexs尾部一个一个取字符转换成二进制字符从尾部开始装入left字符数组中,将三个十六进制字符(3 * 4 = 12)装入left中后,从left尾部以三个二进制数一组(4 * 3 = 12)转换成八进制装入octs[i]字符数组中 重新执行上述步骤
*/
int main() {char hexs[100001], octs[10][130000], left[12];int n, i, j, index, hexs_len, count;int octs_len[10];scanf("%d", &n);for(i = 0; i < n; i++) {scanf("%s", hexs);hexs_len = strlen(hexs);count = 0;index = 0;for(j = hexs_len - 1; j >= 0; j--) {hex2bin(left, count, hexs[j]);count++;if(count == 3) { // count == 3时,left存满三个十六进制字符 for(; count >= 0; count--) {octs[i][index++] = bin2oct(left, count);}count = 0;}}if(count == 1) { // 三个一组从hexs字符数组中取字符不能取完,剩下了一个,即left中还有4个二进制字符 octs[i][index++] = bin2oct(left, 3);if(left[8] == '1') octs[i][index++] = '1';} else if(count == 2) { // 剩下了两个 ,left中还有8个二进制字符 octs[i][index++] = bin2oct(left, 3);octs[i][index++] = bin2oct(left, 2);if(left[4] == '0' && left[5] == '1') octs[i][index++] = '1';else if(left[4] == '1' && left[5] == '0') octs[i][index++] = '2';else if(left[4] == '1' && left[5] == '1') octs[i][index++] = '3';}if(octs[i][index - 1] == '0') index--; // 如果前导数为零,删除之 octs_len[i] = index; //将转换成的八进制字符串长度存入octs_len中 }for(i = 0; i < n; i++) {for(j = octs_len[i] - 1; j >= 0; j--)putchar(octs[i][j]);putchar('\n');}return 0;
}void hex2bin(char left[], int count, char ch) { // 一个十六进制字符转换成四个二进制字符并存入left中 switch(ch) {case '0': strncpy(left + 8 - count * 4, "0000", 4); break;case '1': strncpy(left + 8 - count * 4, "0001", 4); break;case '2': strncpy(left + 8 - count * 4, "0010", 4); break;case '3': strncpy(left + 8 - count * 4, "0011", 4); break;case '4': strncpy(left + 8 - count * 4, "0100", 4); break;case '5': strncpy(left + 8 - count * 4, "0101", 4); break;case '6': strncpy(left + 8 - count * 4, "0110", 4); break;case '7': strncpy(left + 8 - count * 4, "0111", 4); break;case '8': strncpy(left + 8 - count * 4, "1000", 4); break;case '9': strncpy(left + 8 - count * 4, "1001", 4); break;case 'A': strncpy(left + 8 - count * 4, "1010", 4); break;case 'B': strncpy(left + 8 - count * 4, "1011", 4); break;case 'C': strncpy(left + 8 - count * 4, "1100", 4); break;case 'D': strncpy(left + 8 - count * 4, "1101", 4); break;case 'E': strncpy(left + 8 - count * 4, "1110", 4); break;case 'F': strncpy(left + 8 - count * 4, "1111", 4); break;}
} char bin2oct(char left[], int poi) { // 三个二进制字符转成一个八进制字符if(left[poi*3+0]=='0' && left[poi*3+1]=='0' && left[poi*3+2]=='0') return '0';else if(left[poi*3+0]=='0' && left[poi*3+1]=='0' && left[poi*3+2]=='1') return '1';else if(left[poi*3+0]=='0' && left[poi*3+1]=='1' && left[poi*3+2]=='0') return '2';else if(left[poi*3+0]=='0' && left[poi*3+1]=='1' && left[poi*3+2]=='1') return '3';else if(left[poi*3+0]=='1' && left[poi*3+1]=='0' && left[poi*3+2]=='0') return '4';else if(left[poi*3+0]=='1' && left[poi*3+1]=='0' && left[poi*3+2]=='1') return '5';else if(left[poi*3+0]=='1' && left[poi*3+1]=='1' && left[poi*3+2]=='0') return '6';else if(left[poi*3+0]=='1' && left[poi*3+1]=='1' && left[poi*3+2]=='1') return '7';
}

提交后运行错误,下载测试数据显示十六进制数长度达到了16万,将hexs长度改为20万,octs改为octs[10][300000]提交,运行成功。


受疫情影响不能去学校了,看到有人指出代码质量差

十六进制转八进制(C语言版)相关推荐

  1. 蓝桥杯 十六进制转为八进制 C语言版

    ** 蓝桥杯 十六进制转为八进制 ** 题目 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大 ...

  2. 蓝桥杯 十六进制转十进制 C语言版

    蓝桥杯 十六进制转十进制 C语言版 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示 ...

  3. 蓝桥杯 基础练习(十二) 十六进制转八进制 C语言

    十六进制转八进制 C语言 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写字母AF ...

  4. 基础练习 十六进制转八进制 c语言

    基础练习 十六进制转八进制 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写字母A ...

  5. 蓝桥杯简单题之十六进制转八进制(JAVA版)

    首先对等待程序猿成长之路系列的小伙伴们说声抱歉,春节来临,可能要拖更一段时间,但是草稿已经在写,发布将会于春节后进行发布 春节第一天闲着无聊打算找个蓝桥杯的题目练练手,诶嘿,这就找到一题,话不多说,上 ...

  6. 十六进制转八进制C语言实现

    试题 基础练习 十六进制转八进制 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写 ...

  7. C语言十六进制转八进制(附完整源码)

    C语言十六进制转八进制 C语言十六进制转八进制完整源码 C语言十六进制转八进制完整源码 #include <stdio.h>int main() {#define MAX_STR_LEN ...

  8. C语言十六进制转换为八进制(附完整源码)

    十六进制转换为八进制 C语言十六进制转换为八进制完整源码 C语言十六进制转换为八进制完整源码 #include <stdio.h>int main() {#define MAX_STR_L ...

  9. 蓝桥杯练习:C语言十六进制转八进制

    这题对我来说是有点难度的,最后做出来,但是提交显示 运行错误,看不出哪里出错了. 我的思路: 将十六进制转化为二进制,二进制最后转化为八进制. 首先将十六进制存入数组,然后将数组中每一位转化为对应的十 ...

  10. 蓝桥杯基础练习合集一(C语言) 1.A+B问题2.数列排序3.十六进制转八进制4.十六进制转十进制5.十进制转十六进制

    目录 1.A+B问题 2.数列排序 3.十六进制转八进制 4.十六进制转十进制 5.十进制转十六进制 1.A+B问题 问题描述 输入A.B,输出A+B. 输入格式 输入的第一行包括两个整数,由空格分隔 ...

最新文章

  1. python爬虫赚钱的经历-聊一聊,这些年我用Python爬虫挣钱的那些事
  2. javascript调试工具
  3. 2018-2019-1 20165324_20165302_20165321 实验一 开发环境的熟悉
  4. mysql去除重复数据 重建表_删除掉mysql 的.ibd,.frm,ibdata1,ib_logfile0和ib_logfile1文件后再drop表。然后重建此表,有问题吗...
  5. 一个图片展示效果的站点
  6. Fiori应用全屏功能的实现 - fullscreen
  7. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...
  8. Android Studio之编译t提示Invoke-customs are only supported starting with Android O (--min-api 26)
  9. java控制面板作用_大师为你分析win7系统打开java控制面板的方法
  10. 彩色粉末粉尘喷溅高清素材,让热烈气氛烘托到极致
  11. 团队编程项目作业6-程序维护
  12. jQuery:ajax中form表单serialize()序列化方法
  13. 【IDEA/SVN】IDEA 从SVN导入项目到本地
  14. matlab单服务排队模型,MATLAB模拟银行单服务台排队模型
  15. JavaScript 设计模式之组合模式
  16. 在线apt-get安装mysql_apt-get安装mysql
  17. 考勤登记管理系统(参考答案)
  18. PHP爆绝对路径方法总结帖
  19. volatile-内存屏障
  20. wxPython官方文档翻译第一期初稿

热门文章

  1. JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)
  2. 君正 Halley6 开发板调试SPI LCD
  3. 4 款超级好用的终端文件管理器
  4. PyQt学习随笔:QWidget的QFont的kerning、Antialiasing属性用途
  5. 审稿意见回复信英文模板和语料总结
  6. Android 6.0 状态栏信号图标分析
  7. ARM服务器搭建 我的世界(MC) 1.18.2 版私服教程
  8. 【工作感悟】老程序员总结的四条工作经验教训
  9. USB gadget设备驱动解析
  10. Itext中强行调整行高缩小行间距