在给定的一段数字间添加+号构成等式,再求和。求所有可能的等式的和。每两个数字之间要么有+要么没有+,这可以对应于“1”和“0”。所以这个题就一个怎么放“1”的问题了。假设十个数1 2 3 4 5 6 7 8 9 0那么这十个数正好有9个空可以放“1”和“0”。(1,0分别代表有+号和无+)。那9个空的放法不就是29(即000000000~111111111),29才512。枚举每一种情况时间也不多。
#include<bits/stdc++.h>
#define sc scanf
typedef long long ll;
using namespace std;
ll brr[1010],arr[1010];
int main()
{
ll n;
while(cin>>n)
{
int cnt=0;
while(n)
{
arr[cnt++]=n%10;
n/=10;
}
ll ans=0;
reverse(arr,arr+cnt);
ll len=1<<(cnt-1);
for(int i=0;i<len;i++)
{
ll t=arr[0];
for(int j=0;j<cnt;j++)
{
if((i&(1<<j))||j==cnt-1)
{
ans+=t;
t=0;
if(j==cnt-1)break;
}
t=t*10+arr[j+1];
}
}
cout<<ans<<"\n";
}
return 0;
}