zoukankan      html  css  js  c++  java
  • 【递归】2的幂次方表示

    描述:

    任何一个正整数都可以用2的幂次方表示。例如:

        137=27+23+20

    同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

        2(7)+2(3)+2(0)

    进一步:7=22+2+20(21用2表示)

            3=2+20

    所以最后137可表示为:

        2(2(2)+2+2(0))+2(2+2(0))+2(0)

    又如:

        1315=210+28+25+2+1

    所以1315最后可表示为:

        2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    输入:

    一个正整数n(n≤20000)。

    输出:

    一行,符合约定的n的0,2表示(在表示中不能有空格)。

    样例输入:

    137

    样例输出:

    2(2(2)+2+2(0))+2(2+2(0))+2(0)

    来源:

    NOIP1998复赛 普及组 第一题

    思路:

       根据题目描述可以看出是用递归,因为不好保存括号加号,所以可以边递归边输出。

      递归函数的参数为n,设p,s,用p*=2来表示n,s用来表示指数,写一个while(p/2<=n)循环,如果p/2等于n则n能用2的s-1次方表示,所以继续递归2( digui(s-1) );如果p/2不等于n,则n用2的s-1次方加n-p/2表示,所以继续递归2( digui(s-1) )+digui(n-p/2)。所以临界条件为,n==1和n==2时。

    代码如下:

    #include <iostream>
    
    using namespace std;
    void digui(int n);
    int main()
    {
        int n;
        cin>>n;
        digui(n);
    
        return 0;
    }
    void digui(int n){
    //临界条件
    if(n==2){
        cout<<"2";
        return;
    }
    if(n==1){
        cout<<"2(0)";
        return;
    }
    int p=1,s=0;
    while(p<=n){
        p*=2;
        s++;
    }
    if(n==p/2){
        cout<<"2(";
        digui(s-1);
        cout<<")";
    }
    else{
        //因为2的一次方是2不是2(1),所以单独讨论
        if(p/2==2){
            cout<<"2+";
            digui(n-p/2);
        }
        else{
            cout<<"2(";
            digui(s-1);
            cout<<")+";
            digui(n-p/2);
        }
    }
    }
     
    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    Codeforces Round #702 (Div. 3) 题解
    Educational Codeforces Round 104 (Rated for Div. 2) A~E题解
    AtCoder Regular Contest 112 A~D题解
    Codeforces Round #701 (Div. 2) A~E 题解
    java String, StringBuffer, StringBuilder简单介绍和使用
    货仓选址
    线程的同步
    数据结构课设作业
    线程的生命周期(java 图)
    JAVA多线程的创建和使用
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7207833.html
Copyright © 2011-2022 走看看