问题描述
给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数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;
}
两种方法都是可以通过的。。。
系统不会检查你是否用了递归
来源:CSDN
作者:AkagiSenpai
链接:https://blog.csdn.net/weixin_44176696/article/details/104158164