【递归】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);
    }
}
}

 

 

 
posted @ 2017-07-19 20:52  路人姜。  阅读(531)  评论(0编辑  收藏  举报