#include <stdio.h>
unsigned char level( int m ) //计算结点所在的层次
{
unsigned char lvl = 0;
while( m )
{
m >>= 1;
lvl ++;
}
return lvl;
}
int main()
{
unsigned int m = 0, n = 0;
unsigned char lvl = 0;
unsigned int num = 0;
while(scanf("%u%u", &m, &n) && m && n)
{
lvl = level(n) - level(m);
num = (1 << lvl) - 1;
m <<= lvl;
if( n >= m )
num += n - m + 1;
m |= (1 << lvl) - 1;
if( n > m )
num -= n - m;
printf("%u\n", num);
}
return 0;
}
题目:完全二叉树的子树
问题描述
对一棵完全二叉树,采用自上而下、自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点?
输入格式
输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。0 0表示输入结束。
输出格式
对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。
样例输入
3 12
0 0
样例输出
4