欢迎使用CSDN-markdown编辑器

来源:互联网 发布:淘宝上亚马逊会员代买 编辑:程序博客网 时间:2024/05/29 13:10

题目描述:

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

137=2^7+2^3+2^0

同时约定方次用括号来表示,即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复赛 普及组 第一题


分析:
从题目可以知道,输入的数据137先按指数从大到小分为2(7)+2(3)+2(0),然后再将指数按上面同样的方法分为2(2)+2+2(0),2+2(0),0,就可得出 最后结果2(2(2)+2+2(0))+2(2+2(0))+2(0)。显然,这道题应该运用递归。

不妨设要进行这种最后运算的数为递归的出口是s,显然递归出口有两种情况s == 1 或者s == 2

s == 1,那么输出2(0)
s == 2 那么输出2

那么下面就是如何将大于2的数进行转换的问题了
因为题目涉及2的幂次方,因此要首先计算大于s的的最小的2^n的数,记为p,并记录指数为s。为了达到这个目的,可以采用while循环,代码如下:

    int p = 1;        int s = 0;    //用来求指数     while(p<=n)    //这里写带等号的话,比较方便后面的计算;     {        p = p*2;        s++;    }        s--;  //因为p已经大于n了,因此p/2的指数,也就是s-1就是最接近s的指数

这是求最大指数,然后很显然就是拿s减去p/2,然后进行同样的操作。不过这里要注意下,从题目,题目看,2不能写成2(2(0)),因此要 考虑p == 4这种情况,代码如下:

if(n == p/2)             //用数学语言将就是对n以2为底取对数,得到的是整数    {        cout << "2(";        resolve(s);        cout << ")";    }     else    {        if(p == 4)     //这是特殊情况,如果没有这句,就会出现2(2(0)这种奇葩形式         {            cout << "2+";            resolve(n-p/2);        }        else        {            cout << "2(";            resolve(s);            cout << ")+";            resolve(n-p/2);        }    }

附上全部代码

#include<iostream>using namespace std;void resolve(int n);int main(void){    int n;    cin >> n;    resolve(n);    return 0;}void resolve(int n){    if(n == 1)   //递归出口1     {        cout << "2(0)";         return;    }    if(n == 2)    //递归出口2     {        cout << "2";        return;     }    int p = 1;    int s = 0;    //用来求最大幂     while(p<=n) //循环结束后,p>n;     {        p = p*2;        s++;    }    s--;    if(n == p/2)    {        cout << "2(";        resolve(s);        cout << ")";    }     else    {        if(p == 4)     //这是特殊情况,如果没有这句,就会出现2(2(0)这种奇葩形式         {            cout << "2+";            resolve(n-p/2);        }        else        {            cout << "2(";            resolve(s);            cout << ")+";            resolve(n-p/2);        }    }}

如有错误,恳请指点,O(∩_∩)O谢谢

原创粉丝点击