#递归分治#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; }