zoukankan      html  css  js  c++  java
  • 题目1113:二叉树

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:3332

    解决:983

    题目描述:


        如上所示,由正整数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 12
    0 0
    样例输出:
    4
    来源:
    2007年北京大学计算机研究生机试真题
    题目不难,但是递归超时,可以计算出层数,用公式算结点数,就不写了。
    有一个递归的问题,就是每组数据完成后,因为time是全局变量,所以下次使用时不会置零,如果在递归中清零,也会跪了不是。所以在main()的调用后time=0,因为time全局变量,这样写是可以接受的。
    递归代码:
     1 #include <stdio.h>
     2 int time=0;
     3 int timecount(int m,int n)
     4 {    
     5     if(m<=n)
     6         time++;    
     7     else
     8         return 0;
     9     timecount(2*m,n);    
    10     timecount(2*m+1,n);
    11     
    12     return time;
    13 }
    14 int main(void)
    15 {
    16     int m,n,t;
    17     
    18     while(scanf("%d %d",&m,&n)!=EOF&&m!=0)
    19     {    
    20         t=timecount(m,n);
    21         time=0;
    22         printf("%d
    ",t);
    23     }
    24     return 0;
    25 }
  • 相关阅读:
    html的入门——从标签开始(2)
    Idea快捷键
    Java_core复习
    gitblit重置管理员密码【gitblit】
    使用命令创建git仓库
    Windows平台下搭建自己的Git服务器【gitblit】
    python笔记
    代码整洁之道
    Vue学习02
    Vue学习01
  • 原文地址:https://www.cnblogs.com/sairre/p/3956084.html
Copyright © 2011-2022 走看看