题目意思是:给你一串1~9的数字在中间加+和=号看看能不能相等,,,问如果相等,,有几种加法,,,由于数据比较小我是直接枚举过的,,,暴力了点,,但是写的时候还是会有错,,,
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
using namespace std;
#define ll long long
char s[20];
int p[20];
ll getsum(int l,int r)
{
ll sum=0;
for(int i=l;i<=r;i++)
sum=sum*10+p[i];
return sum;
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%s",&s))
{
int vist[20];
if(s[0]=='E')
{
break;
}
int ans=0;
int n=strlen(s);
for(int i=0;i<n;i++)
{
p[i]=s[i]-'0';
}
for(int i=0;i<(1<<(n-1));i++)
{
memset(vist,0,sizeof(vist));
for(int j=0;j<n-1;j++)
{
if(i&(1<<j))
vist[j]=1;
}
for(int j=0;j<n-1;j++)
{
int y,flag2=0;
if(vist[j]==1){
flag2=1;
y=j;
}
ll l=0,r=0,sum1=0,sum2=0,flag1=0;
for(ll k=0;k<n-1;k++)
{
if(vist[k]==1&&y!=k)
{
r=k;
if(flag1==0)
{
sum1+=getsum(l,r);
}
else
{
sum2+=getsum(l,r);
// printf("<<<<<%d\n",sum2);
}
l=k+1;
}
if((vist[k]==1)&&(y==k))
{
r=k;
flag1=1;
sum1+=getsum(l,r);
l=k+1;
}
if(k==n-2)
{
r=n-1;
sum2+=getsum(l,r);
// printf("+++%lld\n",sum2);
}
}
/* if(flag2==1){
printf("%d\n",y);
for(int k=0;k<n-1;k++)
if(vist[k]==1)
printf("%d ",k);
printf("\n");
printf("%lld %lld\n",sum1,sum2);
}*/
if((sum1==sum2)&&(flag2==1)){
/* printf("%d\n", y);
for(int k=0;k<n-1;k++)
if(vist[k]==1)
printf("%d ",k);
printf("\n");
*/
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
401

被折叠的 条评论
为什么被折叠?



