問題 B: 二叉樹

題目鏈接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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章