您的位置:首页 > 其它

题目1113:二叉树

2015-05-07 22:17 239 查看
题目描述:



如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

输入:
输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。

输出:
对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。

样例输入:
3 120 0


样例输出:
4


C++代码:

#include<stdio.h>
#include<math.h>
int m,n,cnt;
int main(void){
while(scanf("%d%d",&m,&n)&&(m&&n)){
cnt = 0;
int i = 0;
int left = m;
while(m<n){
cnt += (int)pow(2.0,i++);
m = m*2+1;
left*=2;
}
if(n>=left)cnt+=n-left+1;
printf("%d\n",cnt);
}
return 0;
}
/**************************************************************
Problem: 1113
User: Carvin
Language: C++
Result: Accepted
Time:0 ms
Memory:1108 kb
****************************************************************/


代码2:

#include<stdio.h>
#include<math.h>

int main()
{
int m,n;
int left,right;
int deep_m,deep_n;
int deep_diff;
int count=0;
for(scanf("%d%d" ,&m,&n);(m!=0&&n!=0);scanf("%d%d",&m,&n ))
{
left=right=m;
count=0;
deep_m=(int)(log(float(m))/log(2.0)+1);   //计算节点m对应的深度
deep_n=(int)(log(float(n))/log(2.0)+1);   //计算节点n对应的深度
deep_diff=deep_n-deep_m;                  //计算深度差
count+=(int)pow(2,(float(deep_diff)))-1;  //计算出
for(int i=1;i<=deep_diff;++i)
{
left=2*left;
right=2*right+1;
}//for
if(left<=n)
count+=n-left+1;
if(right<=n)
count+=right-left+1;
//cout<<count<<endl;
printf("%d\n",count);
}//for
return 1;
}//main
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: