#深搜#(修改后)洛谷 1010 幂次方

题目

把一个十进制整数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+2xx>xx=x)。
PS: 在 题 目 中 , 2 用 2 表 示 , 1 用 2 ( 0 ) 表 示 , 一 般 情 况 , 2 x 表 示 为 2 ( x ) 在题目中,2用2表示,1用2(0)表示,一般情况,2^x表示为2(x) 2212(0)2x2(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值