标签:online judge 九度 二叉树 数据 math.h
如上所示,由正整数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 120 0
4
C++代码:
#include<stdio.h> #include<math.h> int m,n,cnt; int main(void){ while(scanf("%d%d",&m,&n)&&(m&&n)){ cnt = 0; int i = 0; int left = m; while(m<n){ cnt += (int)pow(2.0,i++); m = m*2+1; left*=2; } if(n>=left)cnt+=n-left+1; printf("%d\n",cnt); } return 0; } /************************************************************** Problem: 1113 User: Carvin Language: C++ Result: Accepted Time:0 ms Memory:1108 kb ****************************************************************/
#include<stdio.h> #include<math.h> int main() { int m,n; int left,right; int deep_m,deep_n; int deep_diff; int count=0; for(scanf("%d%d" ,&m,&n);(m!=0&&n!=0);scanf("%d%d",&m,&n )) { left=right=m; count=0; deep_m=(int)(log(float(m))/log(2.0)+1); //计算节点m对应的深度 deep_n=(int)(log(float(n))/log(2.0)+1); //计算节点n对应的深度 deep_diff=deep_n-deep_m; //计算深度差 count+=(int)pow(2,(float(deep_diff)))-1; //计算出 for(int i=1;i<=deep_diff;++i) { left=2*left; right=2*right+1; }//for if(left<=n) count+=n-left+1; if(right<=n) count+=right-left+1; //cout<<count<<endl; printf("%d\n",count); }//for return 1; }//main
标签:online judge 九度 二叉树 数据 math.h
原文地址:http://blog.csdn.net/carvin_zh/article/details/45567847