AcWing每日一题 3483.2的幂次方(递归)

2的幂次方

原题链接

每个正数都可以用指数形式表示。

例如,137=27+23+20。

让我们用 a(b) 来表示 ab。

那么 137 可以表示为 2(7)+2(3)+2(0)。

因为 7=22+2+20,3=2+20,所以 137 最终可以表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。

给定一个正数 n,请你将 n 表示为只包含 0 和 2 的指数形式。
数据范围
1≤n≤20000,
每个输入最多包含 100 组数据。

输入格式
输入包含多组数据。
每组数据占一行,一个正数 n。

输出格式
每组数据输出一行,一个指数形式表示。

输入样例:
1315
输出样例:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)


1998年NOIP普及组题目,一个比较简单的递归,特判输入为1的情况即可
AC代码:

//手机双击代码可以全屏看代码哦
#include<bits/stdc++.h>
using namespace std;
void f(int x){
	if(x==2){//如果x为2,无法继续细分,输出2后return 
		printf("2");
		return ;	
	}
	if(x==1){//x为1的情况对应前面2^1,所以输出2 
		printf("2");
		return ;
	}
	if(x==0){ 
		printf("0");
		return ;
	}
	bool flag=0;
	for(int i=14;i>=0;--i){
		if((1<<i)&x){
			if(flag)printf("+");//如果不是第一个输出则输出加号 
			flag=1;
			if(i!=1)printf("2(");//特判i是否等于1,如果等于1即2的1次方 
			f(i);//递归          //不需要输出2(1),输出2即可 
			if(i!=1)printf(")");
		}
	}
}
int main(){
	int n;
	while(cin>>n){
		if(n!=1)f(n);
		else printf("2(0)");
		printf("\n");
	}
	return 0;//保持好习惯,和点赞一样
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值