递归 将一个十进制数转化为随意进制数
递归 将一个十进制数转化为任意进制数
作者 : 卿笃军
将一个十进制数转化为任意进制数(2~16进制之间)~
C语言版:
#include <stdio.h> //n:原数(10进制) to:将转换成的进制 buf:保存转换后的进制数 void fn(int n, int to, char *buf) { //将i定义为静态的目的:为了在多层递归里面使用的是同一个i值 static int i = 0; //特殊情况0,独立出来处理 if (n == 0) { buf[i] = '0'; return; } //对于负数的预处理 if (n < 0) { buf[i] = '-'; ++i; n = -n; } //正整数递归,进行进制转换. if (n != 0) { //递归入栈 fn(n/to,to,buf); //递归弹栈 switch(n%to) { case 15: buf[i] = 'F'; break; case 14: buf[i] = 'E'; break; case 13: buf[i] = 'D'; break; case 12: buf[i] = 'C'; break; case 11: buf[i] = 'B'; break; case 10: buf[i] = 'A'; break; default: buf[i] = (n%to+'0'); break; } ++i; } } int main() { char buf[50] = ""; int n, to; scanf("%d%d",&n,&to); //进制转换 fn(n,to,buf); puts(buf); return 0; }C++版,优化了一下程序,精简了一些代码~~~
原来我一直以为static 定义数据类型的时候,右值必须是一个const值,当然,我当初在C环境下测试的时候也是这样的。
示例:
1)static int a = 0; √
2)static int a = (1 == 2)? 1 : 3; ×
不过,今天看到同学写第二种形式,竟然也是对的。后来问了一下,原来是.cpp后缀。
递归的时候,将一些执行语句放入static 里面,由于static语句只执行一次,在里面放入一些,只需要执行一次的语句再好不过了~~~~
下面代码,请在.cpp 文件下面执行,.c会报错~~~
#include <stdio.h> //n:原数(10进制) to:将转换成的进制 char *fn(int n, int to) { //定义静态变量的目的:为了在多层递归里面使用的是同一个值,且static只执行一次 static char buf[100] = "", BinHex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //进行n == 0 和 n < 0 的情况处理,static只执行一次 static int i = (n >= 0) ? (buf[0] = '0',0) : (buf[0] = '-',n = -n,1); //正整数递归,进行进制转换. if (n != 0) { //递归入栈 fn(n/to,to); //递归弹栈 buf[i++] = BinHex[n%to]; } return buf; } int main() { char *buf = NULL; int n, to; //输入n:原数据 to:需要转化成的进制 scanf("%d%d",&n,&to); //进制转换 buf = fn(n,to); puts(buf); return 0; }当然,上述代码,没有对超过16进制和小于2进制的时候进行处理~~~~
参考文献:SnailSet的博客专栏,将十进制整数转换成b进制字符串 (递归和非递归实现),http://blog.****.net/snailset/article/details/26492715