【9406】2的幂次方

Time Limit: 10 second
Memory Limit: 2 MB

问题描述
任何一个正整数都可以用2的幂次方表示.
例如:137=2^7+2^3+2^0
同时约定次方用括号来表示,即a^b可表示为a(b)
由此可知,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
Input

正整数(n<=20000)

Output

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

Sample Input

73

Sample Output

2(2(2)+2)+2(2+2(0))+2(0)
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=9406

【题解】

数字最大为2e4;
log2e4大概为15;
就预处理处理出0..15的二进制形式就好(写成字符串);
(直接手算就好);
然后对n进行求二进制的过程;
对最后为1的位加上相应的权2^x即可;
x用预处理出的0..15输出即可;
然后有些地方要注意下
2^3要写成2^(2(2+2^(0));
不能出现3;
再有就是2^1要把1去掉;即只输出2;

【完整代码】

#include <cstdio>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int n;
string a[16];
vector <string> ans;

void get_ans(int x,int num)
{
    if (x==0)
        return;
    get_ans(x>>1,num+1);
    if (x&1)
    {
        if (num==1)
            ans.push_back("2");
        else
            ans.push_back("2(" + a[num] + ")");
    }
}

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    a[0] = "0";
    a[1] = "2(0)";
    a[2] = "2";
    a[3] = "2+2(0)";
    a[4] = "2(2)";
    a[5] = "2(2)+2(0)";
    a[6] = "2(2)+2";
    a[7] = "2(2)+2+2(0)";
    a[8] = "2("+a[3]+")";
    a[9] = a[8]+"+"+a[1];
    a[10] = a[8]+"+"+a[2];
    a[11] = a[8]+"+"+a[2]+"+"+a[1];
    a[12] = a[8]+"+"+a[4];
    a[13] = a[8]+"+"+a[5];
    a[14] = a[8]+"+"+a[6];
    a[15] = a[8]+"+"+a[7];
    cin >> n;
    get_ans(n,0);
    int len = ans.size();
    for (int i = 0;i <= len-1;i++)
    {
        cout << ans[i];
        if (i==len-1)
            cout <<'
';
        else
            cout <<'+';
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626960.html