题目
把一个十进制整数n转换为
∑
2
x
\sum2^x
∑2x,且x继续转换,使最后只剩2和0,以指数从大到小排列(
2
x
+
2
x
′
且
x
>
x
′
或
x
=
x
′
2^x+2^{x'}且x>x'或x=x'
2x+2x′且x>x′或x=x′)。
PS:
在
题
目
中
,
2
用
2
表
示
,
1
用
2
(
0
)
表
示
,
一
般
情
况
,
2
x
表
示
为
2
(
x
)
在题目中,2用2表示,1用2(0)表示,一般情况,2^x表示为2(x)
在题目中,2用2表示,1用2(0)表示,一般情况,2x表示为2(x)
分析
可以发现137可以表示为
2
7
+
2
3
+
2
1
2^7+2^3+2^1
27+23+21即最后的
2
2
2
+
2
+
2
0
+
2
2
+
2
0
+
2
0
2^{2^2+2+2^0}+2^{2+2^0}+2^0
222+2+20+22+20+20
把每个指数查一下
7
=
2
2
+
2
+
2
0
,
3
=
2
+
2
0
,
1
=
2
0
7=2^2+2+2^0,3=2+2^0,1=2^0
7=22+2+20,3=2+20,1=20
PS:当该层次输出过,flag记为1,层次没有输出完时判断flag输出+
所以,先建立一棵搜索树(深搜)(这里不关注+),just like this
所以,搜到n的最大指数x,x为1时只输出2,否则分别在搜索前后输出()
特判n为0
代码
#include <cstdio>
using namespace std;
int n;
void dfs(int n){
if (n==0) {putchar('0'); return;}//特判
int z=16; bool flag=0;
while (n){
while ((1<<z)>n) z--;//找到最大的指数
if (flag) putchar('+');//当同一层次输出过
putchar('2');
if (z!=1) putchar('('),dfs(z),putchar(')');//需要输出括号
flag=1; n-=(1<<z);//n对应减去,并标记该层次输出过
}
}
int main(){
scanf("%d",&n);
dfs(n);
return 0;
}