算法训练 2的次幂表示

mac2024-02-21  65

问题描述

  任何一个正整数都可以用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); }

 

最新回复(0)