牛客oj 习题8.3 2的幂次方(DFS)

挺不错的递归题,给出一个数,将他拆成只有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;
}
发布了411 篇原创文章 · 获赞 72 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/Flynn_curry/article/details/104846182