题目链接:http://exam.upc.edu.cn/problem.php?id=6467
题意:给你一个数字,在数字里任意加+号,问所有情况下,这个sum是多少
我本来想了一种,后来发现这个题真的有意思。
我有4种方法。
第一种:自己写的,枚举 len从1~n。出现的个数和 +号的位置有关。
#include<bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; int len; ll f(int pos,int L){ ll ret=0,ed=pos+L-1; for(int i=pos;i<=ed;i++){ ret=ret*10+(s[i]-'0'); } return ret; } int main() { ll n; scanf("%s",s+1); len=strlen(s+1); sscanf(s+1,"%lld",&n); ll ans=0,tmp; for(int i=1;i<=len;i++){ for(int j=1;j+i-1<=len;j++){ int cur=len-i-1; if(1<j&&j<len-i+1){ cur--; } cur=max(0,cur); tmp=f(j,i)*pow(2,cur); ans=ans+tmp; //printf("%d %d %lld\n",i,j,tmp); } } printf("%lld\n",ans); return 0; }
第二种:运用了二进制来实现,二进制的某一位&1,可以把当前位看作有‘+’号。
#include<bits/stdc++.h> using namespace std; char s[1000]; int main() { scanf("%s",s); int len = strlen(s); int m=(1<<(len-1)); long long ans=0,t; for(int i=0;i<m;i++){ t=s[0]-'0'; for(int j=0;j<len;j++){ if(j==len-1||i&1<<j){ ans+=t; t=0; if(j==len-1) break; } t*=10; t+=s[j+1]-'0'; } } printf("%lld\n",ans); return 0; }
第三种的确是我所想的:利用string 加一个'+'来实现。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll x(string s){ ll sum=0,tmp=0; for(int i=0;i<s.size();i++){ if(s[i]=='+'){ sum+=tmp; tmp=0; }else{ tmp=tmp*10+s[i]-'0'; } } return sum+tmp; } int main() { string s; cin>>s; int len=s.size()-1,a[100]={0}; ll sum=0; while(1){ string ss; for(int i=0;i<len;i++){ a[i+1]+=a[i]/2; a[i]%=2; } if(a[len]){ break; } for(int i=0;i<len;i++){ ss+=s[i]; if(a[i]){ ss+="+"; } } ss+=s[len]; sum+=x(ss); a[0]++; } cout<<sum<<endl; return 0; }
第四种:BFS
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=1e6+10; string st; long long sum; struct point{ string ss; int po; ll v; }; void bfs(point pp) { queue<point>q; q.push(pp); while (!q.empty()) { point p=q.front(); q.pop(); string sss=p.ss; int po=p.po; if (po==st.length()-1) { sum+=p.v; continue; } long long v=0; point pt; for (int i=1;po+i<st.length();i++) { v=0; string sy=st.substr(po+1,i); for (int j=0;j<sy.length();j++) v=v*10+(sy[j]-'0'); //cout<<v<<"%%%%%%%%%%%%%%%%%%%%"<<endl; pt.ss=sy; //cout<<pt.ss<<"$$$$$"<<endl; pt.v=v+p.v; pt.po=po+i; q.push(pt); } } } int main() { int k,po,cc=0; long long v=0; cin>>st; sum=0; for (int i=1;i<=st.length();i++) { point pp; pp.ss=st.substr(0,i); pp.po=i-1; v=0; for (int j=0;j<pp.ss.length();j++) { v=v*10+(pp.ss[j]-'0'); } pp.v=v; //cout<<pp.v<<" "<<pp.ss<<"+++++"<<endl; bfs(pp); } cout<<sum<<endl; return 0; }