九度1113

#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;  
}   

猜你喜欢

转载自blog.csdn.net/LiuJiuXiaoShiTou/article/details/78601978