递归专题---[1]进制转换

0.简介

昨晚思考问题的时候,应该是想了好多问题,所以才有了这么个想法,给递归思想做个简单总结吧。

1.进制转换


这里就带着问题一起分析递归思想。首先,进制转换怎么做,10进制转换到2,8,16进制,先从最简单的问题思考,12345,这个数是一个10进制数,将其从10进制转换到10进制,听起来挺奇怪的,这也是分析问题的方法。步骤如下。

1.   12345,首先对10求余数,得到5,然后再除以10取整得到1234

2.    1234 对10取余数,得到4,......

3.  123...  3

4.   12...   2

5.   1...     1

上面的过程下来,我们得到的是54321,这个是反着来的,要是正过来就对了。

观察上面5个步骤,我们会不会发现一个共性?答案是会的,每个步骤都是一个数n对10求余数,然后除以10,在用下一个结果m继续重复这种操作,也就是我们可以写一个函数来实现这个简单的操作。

string toBase(int number, int base)
{
	int n = number % base;
	int m = number / base;
	return "";
}

上面这段代码就是描述每个操作,取余后除以10,这个整个流程是循环下去的,也就是1步骤结束了就是2步骤,2然后是3,然后每个步骤的过程是一样的,就是输入的参数不同,也就是每个步骤的n是不同的,1步骤结束后,用1步骤的结果再去调用1流程。那么代码就是如下。

string toBase(int number, int base)
{
	//操作步骤
	int n = number % base;
	int m = number / base;
	//调用操作步骤
	toBase(m, base);
	return "";
}

上面代码就是一个流程结束后,用新的结果再去调用这个流程。此时,我们流程中的结果需要保存。

string toBase(int number, int base)
{
	//操作步骤
	int n = number % base;
	int m = number / base;
	//调用操作步骤
	return toBase(m, base)+(char)(n + '0');
}

上面的代码乍一看不好理解,看下图的分析。

说明

将实际数据带入其中试验一下。

说明

这样一来,就形成了一个结果。

代码如下,我做了一个简化

string toBase(int number, int base)
{
	return number==0 ? "" : toBase(number / base, base)+(char)(number % base + '0');
}

int main()
{
	cout << toBase(9,2) << endl;
	return 0;
}

其中f(0)是特殊情况,也是终止情况,f(0)的时候返回空串。中间的结果都在toBase调用的时候展开。

现在有一个问题,就是当要转换16进制的时候怎么办,所以要做一些修改,判断一下,如果是16进制的时候就处理一下返回ABCD这样的字母。

char numToNum(int n)
{
	return n >= 10 ? (char)(n - 10 + 'A') :(char)(n + '0');
}

string toBase(int number, int base)
{
	return number==0 ? "" : toBase(number / base, base)+ numToNum(number % base);
}
int main()
{
	cout << toBase(123,16) << endl;
	return 0;
}

这里就简单考虑了,大于10 的进制只有16进制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值