摘要:对于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;
}
“`
“`部分结果: