挺不错的递归题,给出一个数,将他拆成只有0~2次幂的形式。把一个数拆成2的幂次的形式,这不就是我们熟悉的二进制吗!所以本题思路就是先将一个数转化成二进制形式,顺序处理二进制数位,如果位数大于等于3,那么继续拆(即转成二进制);如果位数小于等于3,那么做出相应输出。最后再去个头尾,搞定。
PS:这种题只要能写出来就肯定会通过的吧。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 20000;
const int INF = INT_MAX;
vector<int> Change(int num){
vector<int> erjinzhi;
while(num != 0){
erjinzhi.push_back(num % 2);
num /= 2;
}
return erjinzhi;
}
string dfs(int num){
vector<int> box = Change(num);//先将这个数转成二进制
string str;
bool flag = false;
for(int i = box.size()-1; i >= 0; i--){
if(box[i] == 1){
if(flag) str += '+';
flag = true;
if(i >= 3) str += dfs(i);
if(i == 2) str += "2(2)";
if(i == 1) str += "2";
if(i == 0) str += "2(0)";
}
}
return "2(" + str + ")";
}
int main(){
// freopen("in.txt", "r", stdin);
int n;
while(~scanf("%d", &n)){
string ans = dfs(n);
cout << ans.substr(2, ans.size()-3) << endl;
}
return 0;
}