C语言之任意进制的转换
来源:互联网 发布:linux unrar 编辑:程序博客网 时间:2024/05/20 11:51
我们都知道转换进制是一个让人比较头疼的事情,下面我的代码不是最好的,也就仅仅是一个思路而已,至少我认为使用栈来进行进制转换是比较合适的一种方法,好了,不多叙述了。
#include<stdio.h>#include<stdlib.h>/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */#define M sizeof(unsigned int)*8int trans(unsigned n, int d, char s[]){ static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */ char buf[M+1]; int j, i = M; if(d<2||d>16) { s[0]='\0'; /* 不合理的进制,置s为空字符串 */ return 0; /* 不合理的进制,函数返回0 */ } buf[i]='\0'; do { buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/ n/=d; }while(n); /* 将译出在工作数组中的字符串复制到s */ for(j=0;(s[j]=buf[i])!='\0';j++,i++); /* 其中控制条件可简写成s[j]=buf[i] */ return j;}/* 主函数用于测试函数 trans() */main(){ unsigned int num = 253; int scale[]={2,3,10,16,1}; char str[33]; int i; clrscr(); for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++) { if(trans(num,scale[i],str)) printf("%5d = %s(%d)\n",num,str,scale[i]); else printf("%5d => (%d) Error! \n",num,scale[i]); } printf("\n Press any key to quit...\n"); getch();}
下面我们来看看最为核心的一步,那就是获得余数的方式
do { buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/ n/=d; }while(n);
注意这里的buf[i–],便是为了使得目标数对进制数取余后的结果存入buf的尾部,这其实也是利用了栈的知识,此处我们可以把buf数组,看做是一个存储结构为顺序表的顺序栈,这样就可以直接获得转换过进制之后的一串数字了。避免了再次进行尾部获取的步骤。
总结:数据结构不是一套空泛的理论,它是一套灵活的解决问题的法宝,我们要多加思考,多加利用,来优化和改进我们的程序。这也是为什么”有时候优雅的实现,仅仅是需要一个函数,而这个函数必然联系着我们的数据结构“,最后希望我们能够共同进步吧。
0 0
- C语言之任意进制的转换
- C语言将任意数转换成任意进制
- C语言实现任意进制的转换,主要注意代码的小技巧
- 数据结构 栈的应用任意进制转换(c语言实现)
- 【C语言】任意进制之间的转换(支持小数部分)
- Linux下的C语言编程——10进制转换成任意进制的字符串
- 任意进制间的转换(用c语言实现)
- 任意进制转换的总结 (c和java)
- 任意的进制转换
- 任意的进制转换
- 任意进制的转换
- 任意进制的转换
- 任意的进制转换
- C任意进制转换程序
- C任意进制转换程序
- C 任意进制转换程序
- 任意进制转换(c++)
- 数据结构 使用递归任意进制转换(c语言实现)
- 二分图判定和割顶与桥的判断
- 仅通过崩溃地址找出源代码的出错行
- MySQL数据表的基本操作二:表结构查看、修改与表操作
- bzoj3479【Usaco2014 Mar】Watering the Fields
- JavaMap以及Java.Entry详解
- C语言之任意进制的转换
- iOS开发: 使用ARC的工程怎么同时再引用MRC的第三方类库
- BP神经网络的设计实例(MATLAB编程) .
- 《Spring JDBC详解》
- JQuery解析XML数据的几个例子
- java中输入一行字符,分别统计英文字母、空格、数字的个数
- [Java]读取文件方法大全
- 许愿墙
- Gamma分布