递归 将一个十进制数转化为随意进制数

递归 将一个十进制数转化为任意进制数

作者 : 卿笃军


将一个十进制数转化为任意进制数(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