洛谷 P1010幂次方--zhengjun

题目描述

任何一个正整数都可以用 \(2\) 的幂次方表示。例如 \(137=2^7+2^3+2^0\)
同时约定方次用括号来表示,即 \(a^b\)可表示为 \(a(b)\)
由此可知,\(137\) 可表示为 \(2(7)+2(3)+2(0)\)
进一步:

\(7= 2^2+2+2^0\)\(2^1\)\(2\)表示),并且\(3=2^1+2^0\)
所以最后 \(137\) 可表示为 \(2(2(2)+2+2(0))+2(2+2(0))+2(0)\)
又如 \(1315=2^{10} +2^8 +2^5 +2+1\)

所以 \(1315\) 最后可表示为 \(2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)\)

输入格式

一行一个正整数 \(n\)

输出格式

符合约定的 \(n\)\(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\%\) 的数据,\(1\le n\le 2\times 10^4\)

思路

一道典型的递归题,直接 \(dfs\) ,注意,当这个数为\(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;
}

谢谢--zhengjun

posted @ 2022-06-10 18:28  A_zjzj  阅读(20)  评论(0编辑  收藏  举报