题目描述
任何一个正整数都可以用
2
2
2 的幂次方表示。例如
137
=
2
7
+
2
3
+
2
0
137=2^7+2^3+2^0
137=27+23+20。
同时约定方次用括号来表示,即
a
b
a^b
ab可表示为
a
(
b
)
a(b)
a(b)。
由此可知,
137
137
137 可表示为
2
(
7
)
+
2
(
3
)
+
2
(
0
)
2(7)+2(3)+2(0)
2(7)+2(3)+2(0)
进一步:
7
=
2
2
+
2
+
2
0
7= 2^2+2+2^0
7=22+2+20(
2
1
2^1
21用
2
2
2表示),并且
3
=
2
1
+
2
0
3=2^1+2^0
3=21+20。
所以最后
137
137
137 可表示为
2
(
2
(
2
)
+
2
+
2
(
0
)
)
+
2
(
2
+
2
(
0
)
)
+
2
(
0
)
2(2(2)+2+2(0))+2(2+2(0))+2(0)
2(2(2)+2+2(0))+2(2+2(0))+2(0)。
又如
1315
=
2
10
+
2
8
+
2
5
+
2
+
1
1315=2^{10} +2^8 +2^5 +2+1
1315=210+28+25+2+1
所以 1315 1315 1315 最后可表示为 2 ( 2 ( 2 + 2 ( 0 ) ) + 2 ) + 2 ( 2 ( 2 + 2 ( 0 ) ) ) + 2 ( 2 ( 2 ) + 2 ( 0 ) ) + 2 + 2 ( 0 ) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。
输入格式
一行一个正整数 n n n。
输出格式
符合约定的 n n n 的 0 , 2 0,2 0,2 表示(在表示中不能有空格)。
输入输出样例
输入 #1 复制
1315
输出 #1 复制
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2 × 1 0 4 1\le n\le 2\times 10^4 1≤n≤2×104 。
思路
一道典型的递归题,直接 d f s dfs dfs ,注意,当这个数为 1 1 1时要特判。
直接上代码
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int x){
if(x==0){//递归边界
cout<<"0";
return;
}
bool s=1;
int a[100],t=-1,k=x;
memset(a,0,sizeof(a));
while(k){//转化成二进制
a[++t]=k%2;
k/=2;
}
for(int i=t;i>=0;i--){
if(a[i]==1){
if(!s)
cout<<"+";
s=0;
if(i==1)//特判
{
cout<<"2";
continue;
}
cout<<"2(";
dfs(i);
cout<<")";
}
}
}
int main(){
scanf("%d",&n);
dfs(n);
return 0;
}