P1010-幂次方
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define _for(i,a,b) for(int i = (a);i < b;i ++) 4 5 string f(int b) 6 { 7 if(b==1) 8 return "1"; 9 else if(b==0) 10 return "0"; 11 12 string bi; 13 while(b) 14 { 15 if(b&0x1) 16 bi += '1'; 17 else bi += '0'; 18 b >>= 1; 19 } 20 21 string rnt; 22 int n = bi.size(); 23 reverse(bi.begin(),bi.end()); 24 _for(i,0,n) 25 { 26 if(bi[i]=='1') 27 { 28 rnt += "2("; 29 rnt += f(n-i-1); 30 rnt += ')'; 31 } 32 if(i!=n-1) 33 rnt += '+'; 34 } 35 36 return rnt; 37 } 38 39 void wash(string& rnt) 40 { 41 _for(i,0,rnt.size()) 42 { 43 if(rnt[i]=='('&&rnt[i+1]=='1') 44 rnt.erase(i--,3); 45 if(rnt[i]=='+'&&(rnt[i+1]=='+'||rnt[i+1]==')')) 46 rnt.erase(i--,1); 47 } 48 if(rnt[rnt.size()-1]=='+') 49 rnt.erase(rnt.size()-1,1); 50 } 51 52 int main() 53 { 54 int a; 55 scanf("%d",&a); 56 string rnt = f(a); 57 wash(rnt); 58 cout << rnt << endl; 59 return 0; 60 }