hdu 4403

/*
  枚举等号的位置
  分别求出两边的值所有的值 

*/

#include <stdio.h>
#include <string.h>

#define N 17
long long  ssum[N][N];
int len,ans,mid;
char str[N];

void rdfs(int i,long long sum,long long data)
{
    if(i>len)
    {
      if(sum==data)
        ans++;
      return  ;         
    }
    
    for(int k=i;k<=len;k++)
     rdfs(k+1,sum+ssum[i][k],data);
     return ;
}


void ldfs(int i,long long  data)
{
   if(i>mid)rdfs(mid+1,0,data);
   
   for(int k=i;k<=mid;k++)
      ldfs(k+1,data+ssum[i][k]);     
     return  ;
}

int main()
{
   
    int i,j,k;
    while(scanf("%s",str+1)!=EOF)
    {
       if(strcmp(str+1,"END")==0)
         break;
       
       memset(ssum,0,sizeof(ssum));
      // printf("%s\n",str+1);  
       
      len= strlen(str+1);
      
      //printf("(len)%d\n",len);
      
      for(i=1;i<=len;i++)
      {
        for(j=i;j<=len;j++)
        {
           ssum[i][j]=0;
           for(k=i;k<=j;k++)
           {
                ssum[i][j]=10*ssum[i][j]+(str[k]-'0');             
           }
        }  
      }  
      
    //  for(i=1;i<=len;i++)
    //  {
     //   for(j=i;j<=len;j++)
     //    printf("%d ",ssum[i][j]);
      //  printf("\n");
     //  }
      
      ans=0;
      
      for(mid=1;mid<len;mid++)
       ldfs(1,0);
       
     
     printf("%d\n",ans);
                                 
                                
                                
    }
    
return 0;    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值