输入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分别保存上次运算左侧的结果(下次运算左侧的内容)和下次运算右侧的结果(下次运算右侧的内容)。