算法學習(1)枚舉法求運算符


輸入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分別保存上次運算左側的結果(下次運算左側的內容)和下次運算右側的結果(下次運算右側的內容)。

   


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com