题目1113:二叉树 (计算某个结点的子结点个数)

题目描述:                       

v:* {behavior:url(#default#VML);} o:* {behavior:url(#default#VML);} w:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}

    如上所示,由正整数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 12
0 0
样例输出:                       
4
# include<iostream>
//# include<stdio.h>
using namespace std;
 
# include<algorithm>
/*
int main()
{
int n,a[10001];
int i, j, k;
while (cin >> n, n)
{
for (i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
}
return 0;
}
*/
 
int main()
{
    int m, n;
    int i, j, k;
    while (cin >> m >> n)
    {
        if (m == 0 && n == 0)
        {
            break;
        }
        if (n < m)
        {
            cout << 0 << endl;
        }
        else if (n == m)
        {
            cout << 1 << endl;
        }
        else
        {
            k = 1; 
            j = 1;
            for (m *= 2; m <= n; m *= 2)
            {
                j *= 2;
                k += j;
            }
            if (m / 2 + j - 1 <= n)
            {
                //do nothing
            }
            else
            {
                k -= (m / 2 + j - 1 - n);
            }
            cout << k << endl;
        }
    }
    return 0;
}
/**************************************************************
    Problem: 1113
    User: mmcNuaa@163.com
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1520 kb
****************************************************************/
View Code
原文地址:https://www.cnblogs.com/mmcmmc/p/3887629.html