问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 现在约定幂次用括号来表示,即a^b表示为a(b) 此时,137可表示为:2(7)+2(3)+2(0) 进一步:7=2^2+2+2^0 (2^1用2表示) 3=2+2^0 所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如:1315=2^10+2^8+2^5+2+1 所以1315最后可表示为: 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出
思路 :
递归的话 就是重复做一件事情嘛 大家都知道 那么首先 需要 弄清楚 重复做的事情是什么 很容易理清重复做事情就是 给一个整数然后 把这个整数转换为二进制数 然后再根据二进制位 每一位为1的位 的权值 再进行上述步骤 那么 就可以构建一个解答树 我是卡在了 + 号 不知道 怎么加的问题 分析清楚后明白
#include <iostream> #include <algorithm> #include <string.h> #include <iomanip> #include <vector> int getbin(int *arr,int data,int *m) { int yu; int i; int tem; //清零 memset(arr,0,sizeof(int)*20); int cunt=0; while(data) { yu=data%2; arr[cunt++]=yu; data/=2; } for(i=0;i<cunt/2;i++) { tem=arr[i]; arr[i]=arr[cunt-i-1]; arr[cunt-i-1]=tem; } for(i=cunt-1;i>=0;i--) { if(arr[i]==1) { *m=i; break; } } return cunt; } //从左忘右 是第几个 从0开始 void mydigui(int data,int cur) { //应该cur为1 是需要考虑的 int tem; if(data==0) { cout <<"2(0)"; return; }else if(data==1) { cout <<"2"; return; } int i; int arr[20]; int *m=new int[1]; memset(arr,0,sizeof(arr)); int cunt=getbin(arr,data,m); for(;cur<cunt;cur++) { if(arr[cur]==1) { tem=cunt-1-cur; if(tem>=2) { cout <<"2("; } mydigui(tem,0); if(tem>=2) { cout <<")"; } if(cur!=*m) cout <<"+"; } } } int main() { int data; cin >>data; mydigui(data,0); }