题意:在一个数字串里加入加号,等号,使等式成立。有几种方法;
思路:暴搜:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> using namespace std; map<long long,int> mp; int ans; int a[39],len,cnt; void dfs1(long long s,long long t,int c,int k) { if(c==k) { if(mp.find(s+t)==mp.end()) mp[s+t]=1; else mp[s+t]++; return ; } dfs1(s+t,a[c],c+1,k); if(t>0ll) dfs1(s,t*10+a[c],c+1,k); } void dfs2(long long s,long long t,int c,int k) { if(c==k) { if(mp.find(s+t)!=mp.end()) ans+=mp[s+t]; return ; } dfs2(s+t,a[c],c+1,k); if(t>0ll) dfs2(s,t*10+a[c],c+1,k); } int main() { freopen("in.txt","r",stdin); char str[39]; while(~scanf("%s",str)) { if(str[0]=='E') break; len = strlen(str); for(int i=0;i<len;i++) a[i]=str[i]-'0'; ans=0; for(int i=1;i<len;i++) { mp.clear();cnt =1; dfs1(0,0,0,i); dfs2(0,0,i,len); } printf("%d\n",ans); } return 0; }