Description
任何一个正整数都可以用 22 的幂次方表示。例如 137=27+23+20137=27+23+20。
同时约定次方用括号来表示,即 可表示为 a(b)。
由此可知,137 可表示为 2(7) + 2(3) + 2(0)
进一步:^{}
7=+2+ ( 用 2 表示),并且 3 = 2 + 。
所以最后 137 可表示为 2(2(2) + 2 + 2(0)) + 2(2 + 2(0)) + 2(0)。
又如 1315=+++2+1
所以 1315 最后可表示为 2(2(2 + 2(0)) + 2 ) + 2(2(2 + 2(0))) + 2(2(2) + 2(0)) + 2 + 2(0)。
Input
一行一个正整数 n。
Output
符合约定的 n 的 0,2表示(在表示中不能有空格)。
Sample 1
Inputcopy | Outputcopy |
---|---|
1315 | 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) |
Hint
【数据范围】
对于 100%100% 的数据,1≤n≤2×。
方式1
#include<bits/stdc++.h>
using namespace std;
int f[25];//全局变量,因为fun函数里要用到
void fun(int x)
{
if(x == 1)
cout << "2(0)";
else if(x == 2)
cout << "2";
else
{
int k = 15;//2^15=32768
while(x < f[k])//找到比x小的 最大的2的k次幂
k--;
//当k=1时递归(fun(k))会输出2(0),导致打印2 会变成打印 2(2(0))
if(k != 1)
{
cout << "2(";
fun(k);
cout << ")";
}
else//当k=1时直接打印2,无需递归
{
cout << "2";
}
//处理另一块数据
if(x-f[k] != 0)
{
cout << "+";
fun(x-f[k]);
}
}
}
int main()
{
int n;
cin >> n;
//f[k]就是2的k次幂
f[0] = 1;
for(int i = 1;i <= 20;i++)
{
f[i] = f[i-1] * 2;
}
fun(n);
return 0;
}
方式2
#include<bits/stdc++.h>
using namespace std;
void fun(int x)
{
for(int i = 15;i >= 0;i--)
{
if(x >= pow(2,i))
{
if(i == 1)
{
cout<<"2"; //2(1)不用再往后分解了且2^1输出为2,单独出来
}
else if(i == 0)
{
cout<<"2(0)"; //2(0)也不用再往后分解了,单独出来
}
else //若i>1则继续分解指数i
{
cout<<"2(";
fun(i);
cout<<")";
}
x -= pow(2,i); //继续循环分解余下的
if(x != 0)
{
//若此x还没分解完,则后面还有项,所以输出一个+号
cout<<"+";
}
}
}
}
int main()
{
int n;
cin >> n;
fun(n);
return 0;
}