蓝桥杯:递归求二进制表示位数

若如初见. 提交于 2020-02-03 17:41:31

问题描述

给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数9,其对应的二进制数是1001,因此位数是4。

样例输入输出

输入

9

输出

4

思路

题目不难,你可以直接对n求对数log2n 然后得到结果 ↓

#include <iostream>
#include <cmath>

using namespace std;

#define log2(x) ((int)(log(x)/log(2)))

int main()
{
	int n;
	cin>>n;
	cout<<log2(n)+1<<endl;
	
	return 0;
}

但是重点是用递归的思维去解决
二进制对应的是一颗二叉树,它的深度就是二进制数的位数
在这里插入图片描述
深度为1的层能够表示的数是0,1,这就意味着0,1的二进制长度就是1
同理深度为2的层,能够表示2,3
深度为3:4,5,6,7
深度为4:8,9,10,11,12,13,14,15

对于数字x,想要求它的二进制长度,就是求它在二进制树中能有多深

对于x,x/2必定在树的上一层

这就意味着【数字x的二进制数的长度】是【x/2的二进制数长度】+1

于是可以定义递推式:

len(x) = len(x/2) + 1

边界条件:x=0 或 x=1,此时长度为1

完整的递归函数:

int binary_len(int x)
{
	if(x <= 1)
	{
		return 1;
	}
	else
	{	
		return binary_len(x/2) + 1;	
	}
}

代码

#include <iostream>
#include <cmath>

using namespace std;

int binary_len(int x)
{
	if(x <= 1)
	{
		return 1;
	}
	else
	{	
		return binary_len(x/2) + 1;	
	}
}

int main()
{
	int n;
	cin>>n;
	cout<<binary_len(n)<<endl;
	
	return 0;
}

两种方法都是可以通过的。。。
系统不会检查你是否用了递归
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!