看到书上说,这块要把问题转换成比起规模小,且问题相同的子问题,我就开始静下心来想着这个子问题到底是怎么从整个问题里边抽象出来的。然后就想出来啦
注:以下过程估计只有我自己知道说的啥
处理子问题的函数fi的框架:
string fi(n): res="" for i =1~len: 该位为1: 该位表示2的0次幂:res+"2(0)" 该位表示2的1次幂:res+"2" 该位表示为2的2次幂:res+"2(2)" 否则 res+fi(幂数)
几个注意的点:
什么时候加“(”,“)” 左右大括号是成对存在。所以他们必定在某一段函数的一前一后, 且是同一层。在这里看到,第一次出现“(”是2的7次的这个7,他表示为2(2(2)+2 +2(0)),所以只有在2的次方无法直接用2(2)或2或2(0)表示出来,比如说7的时候,才会有一对括号。
什么时候加“+”?1212观察结果可知,加“+”号一定是在每一次的数字被加上之前,在“)"或者数字之后(因为只有几个连续的项之间才需要加大括号。
AC代码:
#include<iostream> #include<stack> #include<cmath> #include<ctype.h> using namespace std; stack<int> record; string to10_2(int n){ string s=""; while(n){ //先化成二进制,看第几位是1,记录下来 int temp=n%2; record.push(temp); n/=2; } int len=record.size(); int cur=len; while(!record.empty()){ int t=record.top(); record.pop(); s+=t+'0'; } return s; } string fi(int n){ string start=to10_2(n); string res=""; int len=start.length(),i; for(i=0;i<len;i++){ if(start[i]=='1'){ if(res[res.length()-1]>='0' && res[res.length()-1]<='9' || res[res.length()-1]==')'){ //需要提前添加加好 res+="+"; } if(len-i-1==0){ //2的0次 res+= "2(0)"; } else if(len-i-1==1){ //2的1次 res+="2"; } else if(len-i-1==2){ //2的2次 res+="2(2)"; } else{ //其他的次数,需要用2的0次,1次,2次来表示 res+="2("; res+=fi(len-i-1); res+=")"; } // cout<<res<<endl; } } return res; } int main(){ int n; cin>>n; cout<<fi(n)<<endl; // while(cin>>n){ // cout<<fi(n)<<endl; // } return 0; }