zoukankan      html  css  js  c++  java
  • 算法学习(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分别保存上次运算左侧的结果(下次运算左侧的内容)和下次运算右侧的结果(下次运算右侧的内容)。

       

  • 相关阅读:
    sql.srcipt
    sowmodaldialog
    4) 删除虚拟应用程序
    JavaScript读写Cookies
    第5章 脚本运行期库对象
    npm serve md 工具 [MD]
    cleanmark 清除格式 博客内容提取 [MD]
    Hex编码 十六进制编码
    Windows Server AppFabric(Codename:"Dublin&Velocity")介绍
    WF4设计器模型:编辑范围ModelEditingScope
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393134.html
Copyright © 2011-2022 走看看