题目描述
任何一个正整数都可以用 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)。
输入格式
一行一个正整数 n。
输出格式
符合约定的 n 的 0, 2 表示(在表示中不能有空格)。
样例 #1
样例输入 #1
1315
样例输出 #1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
【数据范围】
对于 100% 的数据,1 <= n <= 2 x 10^4。
这是一道很经典的递归题目。
#include <iostream>
#include <cmath>
using namespace std;
int n;
void fenjie(int x)
{
for (int i = 14; i >= 0; i--)
{
if (pow(2, i) <= x)//找到第一个最大的幂次方
{
if (i == 1)//如果为一的话直接输出2,不需要再加括号
cout << "2";
else if (i == 0)//如果为0的话也直接输出
cout << "2(0)";
else
{
cout << "2(";//否则说明还可以再次分解
fenjie(i);//递归分解
cout << ")";//输出最后的括号
}
x -= pow(2, i);//去掉最大幂次方后,剩下的数继续进入循环分解
if (x != 0)//如果x不为0,则说明后面还有项,输出加号
cout << "+";
}
}
}
int main()
{
cin >> n;
fenjie(n);
return 0;
}