华为笔试.利用递归进行穷举123456的所有组合情况

摘要:对于123456中间任意的插入加号或减号,求出所有可能的组合以及表达式的结果.
基本思路:(1)对于123456进行类似于回溯算法处理,首先从1开始搜索,以1开头的可能组合有1,12,123,1234,12345,123456.在第一次做决策的基础上,第一次决策如果是1…i,那么第二次就是i+1..6;依次规律进行递归.
(2)对每一种可能的组合都要分为+/-;利用栈将中间的组合记录下来,在最后输出.
(3)当i>6时返回.

#include "stdafx.h"
#include "stdio.h"
#include<string.h>
#include<stdlib.h>
#define N 7 Top = -1;
struct Record
{
    char * C;
};
Record record[N];
void function(char *S,int sum,int mark,char * K)
{
          char S1[N]={0};
          if (mark==N)
          {
               for(int i = 0;i<=Top;i++)
               {
                   printf(" %s",record[i].C);
               }
               printf(" sum = %d: \n    ",sum);
          }
           else
           {   
               K = S+mark-1;
               int number = 0;
               for(int i=1;i<=N-mark;i++ )
               {
                 for(int j=-1;j<=1;j+=2)
                 {
                   memset(S1,0,sizeof(char)*N);
                   strncpy(S1,K,i);
                   number = atoi(S1);
                   if(j>0)
                   {
                       record[++Top].C = "+";
                       record[++Top].C = S1;
                       function(S,sum+j*number,mark+strlen(S1),K);
                       Top -= 2;
                   }// if j>0
                   else
                   {
                       record[++Top].C = "-";
                       record[++Top].C = S1;
                       function(S,sum+j*number,mark+strlen(S1),K);
                       Top -= 2;
                   } // else j<0
                 }
               }
           }
}
int main(int argc, char* argv[])
{
    char* S = "123456";
    int mark=1;
    int sum=0;
    function(S,sum,mark,S);
    return 0;
} 

“`

“`部分结果:这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值