#递归分治#2的幂次#acwing#上交机试题
acwing链接https://www.acwing.com/problem/content/3486/
思路:读取m后,将m在实际内存中存储的01串为1的位数压入动态数组exp中,同时维护一个字符串res用来保存输出结果。想要得到最终正确的字符串,需要返回类型为string的函数处理:
1.加号+在每次用于遍历的i不为0的时候拼接到res后(可以避免算式结束之后多余+)
2.若exp[i]等于1,则直接拼接2即可,没有其他项(类似于递归起始的数据)
3.若exp[i]不等于1;则先拼接(2,再调用函数获取子串,再拼接),保持格式正确
4.0的问题:若传入的整形参数为0,则直接打印一个0;
完成后,用while!=EOF处理多个输入并换行依次输出res内容即可
/*每个正数都可以用指数形式表示。
例如,137=27+23+20。让我们用 a(b)来表示 ab。那么 137可以表示为 2(7)+2(3)+2(0)。
因为 7=22+2+20,3=2+20,所以 137最终可以表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。
给定一个正数 ,请你将 n表示为只包含 0和 2的指数形式。
输入格式
输入包含多组数据。每组数据占一行,一个正数 n。
输出格式
每组数据输出一行,一个指数形式表示。
数据范围
1≤n≤20000,每个输入最多包含 100组数据。
输入样例:
1315
输出样例:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
string Gets2sExponet(int n){
if(n==0){
return "0";
}
vector<int> exp;
for(int i=15;i>=0;i--){
if((n&(1<<i)) != 0){
exp.push_back(i);
}
}
string res="";
for(int i=0;i<exp.size();i++){
if(i!=0){
res+="+";
}
if(exp[i]==1){
res+="2";
}
else{
res+="2("+ Gets2sExponet(exp[i])+")";
}
}return res;
}
int main(){
int m;
while(scanf("%d",&m)!=EOF){
printf("%s\n", Gets2sExponet(m).c_str());
}
return 0;
}

