題目鏈接:http://codeup.cn/problem.php?cid=100000611&pid=1
題目描述
如上所示,由正整數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 7
142 6574
2 754
0 0
樣例輸出
3
63
498
代碼
#include <cstdio>
int n, m, ans;
void fun(int m) {
if(m>n)
return;
fun(2*m); //左子樹的根結點=此根結點*2
fun(2*m+1); //右子樹的根結點=此根結點*2+1
ans++;
}
int main() {
while(scanf("%d%d",&m,&n)) {
ans=0;
if(m==0&&n==0)
break;
fun(m);
printf("%d\n", ans);
}
return 0;
}