直接打表,不用动脑(打 表 次 方)!
思路
反正数据最大2e4也就是说超不过2^15。那么我们直接打表,从0~14都手写出来,然后把输入的数分解了之后就可以直接输出啦!
打表
out[0] = "2(0)";
out[1] = "2";
out[2] = "2(2)";
out[3] = "2(2+2(0))";
out[4] = "2(2(2))";
out[5] = "2(2(2)+2(0))";
out[6] = "2(2(2)+2)";
out[7] = "2(2(2)+2+2(0))";
out[8] = "2(2(2+2(0)))";
out[9] = "2(2(2+2(0))+2(0))" ;
out[10] = "2(2(2+2(0))+2)";
out[11] = "2(2(2+2(0))+2+2(0))" ;
out[12] = "2(2(2+2(0))+2(2))" ;
out[13] = "2(2(2+2(0))+2(2)+2(0))";
out[14] = "2(2(2+2(0))+2(2)+2)";
全部代码:
#include <cmath>
#include <iostream>
using namespace std;
const int N = 15;
int n;
string out[N];
int main()
{
out[0] = "2(0)";
out[1] = "2";
out[2] = "2(2)";
out[3] = "2(2+2(0))";
out[4] = "2(2(2))";
out[5] = "2(2(2)+2(0))";
out[6] = "2(2(2)+2)";
out[7] = "2(2(2)+2+2(0))";
out[8] = "2(2(2+2(0)))";
out[9] = "2(2(2+2(0))+2(0))" ;
out[10] = "2(2(2+2(0))+2)";
out[11] = "2(2(2+2(0))+2+2(0))" ;
out[12] = "2(2(2+2(0))+2(2))" ;
out[13] = "2(2(2+2(0))+2(2)+2(0))";
out[14] = "2(2(2+2(0))+2(2)+2)";
cin >> n;
int flag = 1;
for(int i = N; i >= 0; i--)
{
int t = pow(2, i);
if(n - t >= 0)
{
n -= t;
if(flag == 1)
{
cout << out[i];
flag = 0;
}
else
{
cout << ('+' + out[i]);
}
}
}
return 0;
}