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