ACM模版

描述

题解

典型的递归问题,只要细心,总会搞出事情来的。

这里需要注意的是,加号的输出要额外多判断一下此时拆分的数是否已拆完,如果已经拆完就不要多输出加号了,不然会出现最后结尾多出一个加号,中间会出现若干个 “+)” 的情况(づ ̄3 ̄)づ╭❤~

当然,如果想要最后一起判断也不是不行,先将串存储起来,最后统一去加号即可。一开始我就是这样写的,后来感觉麻烦了,所以改写成了第一种。

代码

#include <iostream>
#include <string>

using namespace std;

const int MAXN = 16;

string s;
int POWER[MAXN];

void init()
{
    POWER[0] = 1;
    for (int i = 1; i < MAXN; i++)
    {
        POWER[i] = POWER[i - 1] * 2;
    }
}

void solve(int n, int k)
{
    for (int i = k; i >= 0; i--)
    {
        if (POWER[i] <= n)
        {
            n -= POWER[i];
            cout << '2';
            if (i == 1)
            {
                if (n == 0)
                {
                    continue;
                }
                cout << '+';
                continue;
            }
            cout << '(';

            if (i == 0)
            {
                cout << '0';
            }
            else
            {
                solve(i, 4);
            }
            cout << ')';
            if (n == 0)
            {
                continue;
            }
            cout << '+';
        }
    }
}

int main(int argc, const char * argv[])
{
    init();

    int N;
    while (cin >> N)
    {
        solve(N, 15);
    }

    return 0;
}