洛谷 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;
}