#include<stdio.h>
int main(){
int m,n;
while(scanf("%d %d",&m,&n) != EOF){
if(m==0 && n==0) break;
int num,sum,left,right;
num=sum=1;
left=m*2; //左孩子节点的数值
right=m*2+1; //右孩子节点的数值
while(right<=n){ //若为满二叉树,则right可以取到n
num=num*2; //从节点m向下,每向下一层,节点数量翻倍
sum+=num; //将每层节点数相加,得到子节点总数
left=left*2;
right=right*2+1; //最左节点和最右节点
}
if(left<=n){ //不是满二叉树,right超出n的范围
sum=sum+(n-left+1); //加上最下面一层的子节点个数
}
printf("%d\n",sum);
}
return 0;
}
九度1113
猜你喜欢
转载自blog.csdn.net/LiuJiuXiaoShiTou/article/details/78601978
今日推荐
周排行