这个代码是抄的是抄的是抄的。只要记录最左和最右就好了,我当时怎么没想到?。
/********************** author: yomi date: 18.8.15 ps:前面的做法自己看着都想笑 这基本上可以看作是完全二叉树 遍历的代价太大了 直接计算多好 从结点m所在的层起一直到倒数第二层 绝对是一棵完全二叉树。 **********************/ #include <iostream> #include <cstdio> using namespace std; int cnt, m, n; int main() { while(cin >> m >> n && m && n) { cnt = 0; int left=m, right = m; while(right <= n){ cnt += right-left+1; right = 2*right+1; left *= 2; } if(n>=left) cnt += n-left+1; cout << cnt <<endl; } return 0; } /** 3 7 142 6574 2 754 0 0 3 63 498 **/