描述
题解
典型的递归问题,只要细心,总会搞出事情来的。
这里需要注意的是,加号的输出要额外多判断一下此时拆分的数是否已拆完,如果已经拆完就不要多输出加号了,不然会出现最后结尾多出一个加号,中间会出现若干个 “+)” 的情况(づ ̄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;
}