//n最多不超过2的15次方,所以可以枚举1到14的表达式,初步遍历一遍生成基础式子, //此基础式子形如:2(9)+2(7)+...,再遍历一遍此基础式子,将中间1到14的数字替换为对应表达式即可。 #include <iostream> #include <string> #include <cmath> using namespace std; string change(char n){ if(n=='0') return "0"; if(n=='2') return "2"; if(n=='3') return "2+2(0)"; if(n=='4') return "2(2)"; if(n=='5') return "2(2)+2(0)"; if(n=='6') return "2(2)+2"; if(n=='7') return "2(2)+2+2(0)"; if(n=='8') return "2(2+2(0))"; if(n=='9') return "2(2+2(0))+2(0)"; if(n=='0'+10) return "2(2+2(0))+2"; if(n=='0'+11) return "2(2+2(0))+2+2(0)"; if(n=='0'+12) return "2(2+2(0))+2(2)"; if(n=='0'+13) return "2(2+2(0))+2(2)+2(0)"; if(n=='0'+14) return "2(2+2(0))+2(2)+2"; return ""; } int main() { string ans=""; int num; cin>>num; int n=14; while(num!=0){//生成基础式 if(num>pow(2,n)){ ans+="2("; ans+=('0'+n); ans+=")+"; num-=pow(2,n); }else if(num==pow(2,n)){ ans+="2("; ans+=('0'+n); ans+=")"; num-=pow(2,n); } n--; } //cout<<ans<<endl; for(int i=0;i<ans.length();){//替换基础式 if(ans[i]==')'){ string str=change(ans[i-1]); int n=str.length(); ans=ans.substr(0,i-1)+str+ans.substr(i); i=i+n; } i++; } for(int i=0;i<ans.length();i++){ if(ans[i]==')'&&ans[i-1]=='('){ ans=ans.substr(0,i-1)+ans.substr(i+1); } }//将“2()“变为“2” cout<<ans; return 0; }