输入ABCDE 5个数,结果Result。寻找所有的运算符组合填充至5个数之间,使得下式成立
A B C D E==Result
枚举法需要满足的条件:
1.阈值候选答案的数量
2.候选答案求解前必须有确定集合
解决方案:
#include"iostream"
using namespace std;
void print(int num[5],int Operator[4],int answer)//输出某个解决方案
{
int i=0;
char index[4]={'+','-','*','/'};
cout<<num[0];
while(i<4)
{cout<<index[Operator[i]];cout<<num[i+1];i++;}
cout<<"="<<answer<<endl;
}
void findSolution(int num[5],int answer)//嵌套循环遍历所有的解决方案
{
int count=0;//计数
int flag;//1=+,-1=-
int Operator[4];
double left,right;//切记此处一定定义为double
for(Operator[0]=0;Operator[0]<4;Operator[0]++)
if(Operator[0]<3||num[1]!=0)
for(Operator[1]=0;Operator[1]<4;Operator[1]++)
if(Operator[1]<3||num[2]!=0)
for(Operator[2]=0;Operator[2]<4;Operator[2]++)
if(Operator[2]<3||num[3]!=0)
for(Operator[3]=0;Operator[3]<4;Operator[3]++)
if(Operator[3]<3||num[4]!=0)
{left=0;right=num[0];flag=1;
for(int i=0;i<4;i++)
{
switch(Operator[i])
{
case 0:
left=left+flag*right;//运算的是当前符号之前2个数
right=num[i+1];//保存当前符号
flag=1;
break;
case 1:
left=left+flag*right;//运算的是当前符号的前2个数
right=num[i+1];
flag=-1;//保存当前符号,在后序操作有优先运算符的时候起作用
break;
case 2:
right=right*num[i+1];
break;
case 3:
right=right/num[i+1];
break;
}
}
if(left+flag*right==answer)
{count++;cout<<count<<":";print(num,Operator,answer);}
}
if(count)
cout<<"总共有"<<count<<"种方案"<<endl;
else
cout<<"无有效解决方案,请重新输入"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"输入6个数,最后一个数为目标结果"<<endl;
int num[5];
int answer;
for(int i=0;i<5;i++) cin>>num[i];
cin>>answer;
findSolution(num,answer);
return 0;
}
分析:
1.以0,1,2,3代表加减乘除进行4嵌套循环 2.当运算符为/时保证最后一个数不为0 3.当前符号为*或/时,直接计算 4.当前符号为+,-时,进行前一个+或-操作 5 left,right分别保存上次运算左侧的结果(下次运算左侧的内容)和下次运算右侧的结果(下次运算右侧的内容)。