#include <iostream> using namespace std; /** node:当前结点 totalNode:总结点数 return:编号为node的结点有多少个孩子结点(包括node) */ int sum(int node, int totalNode){ if(totalNode / 2 == node){ //当前结点的下一层就是叶结点了 if(totalNode % 2 == 0){ //只有左孩子 return 1 + 1; }else{ //左右孩子都有 return 2 + 1; } }else if(totalNode / 2 < node){ //倒数第二层,靠右边的叶结点 return 1; }else{ //totalNode / 2 > node 比较上层的结点 return sum(node * 2, totalNode) + sum(node * 2 + 1, totalNode) + 1; } } int main() { int m,n; //m当前结点, n总结点 while (scanf("%d %d", &m, &n) != EOF) { // 注意 while 处理多个 case if(0 == m && 0 == n){ break; } printf("%d\n", sum(m, n)); } } // 64 位输出请用 printf("%lld")