模拟递归去做。
这道题的思路就是:
- 首先找到和x接近的并且大于X的数。
- 其次对幂进行判断,如果幂等于0或者等于1,那么直接输出,如果大于1,对幂进行递归。
- 用x减去算出来的最接近x的数。
- 最后递归。
如果光说的话可能不好理解,直接上代码。
#include <bits/stdc++.h>
using namespace std;
int n;
int ksm(int a, int b){//快速幂模板,因为数据比较小,没有求余操作。
int res = 1;
while(b){
if(b & 1) res = res * a;
b>>=1;
a = a * a;
}
return res;
}
void dfs(int x){
int y;
if(x == 0) return;//循环结束条件
for(int i = 0; i <16; i ++){
y = i;//记录y
if(ksm(2,i) > x){
y--;//如果找到比x大的数,y--,变为小于x
break;
}
}
if(y == 0) cout << "2(0)";
if(y == 1) cout << "2";
if(y > 1){
cout << "2(";
dfs(y);
cout << ")";//记得要加右括号。
}
x-=ksm(2,y);//继续递归,直到x=0
if(x!=0){
cout << "+";//若此时x!=0,进行连接操作
dfs(x); //继续递归
}
}
int main(){
cin >> n;
dfs(n);
return 0;
}