2 solutions
-
2
与C23lingyiyu不同
我采用字符串存答案再倒序输出
就可以照常按二进制位从低到高循环
需要注意的是存储答案的时候也要倒着存
#include<bits/stdc++.h> using namespace std; int n; string ans="";//答案存这里 void dfs(int w){ //边界条件判断 if(w==0){ ans+="0"; return; }else if(w==1){ ans+=")0(2"; //特别地 倒着存入ans方便倒序输出 return; }else if(w==2){ ans+="2"; return; } int cnt=0;//存目前搜到哪一位 //开始循环二进制位数 while(w){ if(w%2){ if(cnt==1){ ans+="+2"; }else{ ans+="+)"; dfs(cnt); ans+="(2"; } } w>>=1;cnt++; } } int main(){ cin>>n; dfs(n); // cout<<ans<<"\n"; for(int i=ans.size()-1;i>0;i--){//倒序 记住别输出ans第一位(那里是'+') if(ans[i]=='+'&&((ans[i-1]==')'&&ans[i+1]==')')||(ans[i-1]==')'&&ans[i+1]=='2'))) continue; //这边这个特判排除括号里面的多余加号 cout<<ans[i]; } return 0; }
-
2
A1208
#include<bits/stdc++.h> using namespace std; int n; int binpro(int k){ if(k==0)return 1; int ans=1; for(int i=1;i<=k;i++)ans<<=1; return ans; } int maxt(int n){ int ans=0; while(binpro(ans)<=n)ans++; return ans-1; } void dg(int n){ if(n==1){ cout<<"2(0)"; return; } else if(n==2){ cout<<"2"; return; } else{ while(n!=0){ int a=maxt(n); if(a==0){cout<<"2(0)";} else if(a==1){cout<<"2";} else{ cout<<"2("; dg(a); cout<<")"; } n-=binpro(a); if(n!=0)cout<<"+"; } } } int main(){ //cout<<maxt(1); cin>>n; dg(n); return 0; }
- 1
Information
- ID
- 694
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 17
- Accepted
- 5
- Uploaded By