24

首先穷举的可行性问题。我把表达式如下分成三类

1、 无括号的简单表达式。

2、 有一个括号的简单表达式。

3、 有两个括号的较复杂表达式。

穷举的开始我对给出的四个数进行排列,其可能的种数为432*1=24。我利用一个嵌套函数实现四个数的排列

源码:

#include

#include

#include

using namespace std;

const double PRECISION = 1E-6;

const int COUNT_OF_NUMBER = 4;

const int NUMBER_TO_BE_CAL = 24;

double
number[COUNT_OF_NUMBER];

string
expression[COUNT_OF_NUMBER];

bool Judgement = false;

void Search(int n)

{

   int count = 0;

   if (n == 1)

   {

          if (fabs(number[0]
  • NUMBER_TO_BE_CAL) <= PRECISION) //对于除法,要小心小数的精确位数

            {
    
                   cout
    

<< expression[0] << “\t\t”;

                 Judgement

= true;

                 count++;

                 if

((count % 3) == 0)

                        cout

<< endl;

          }

          else

          { }

   }

   for (int i = 0; i <

n; i++)

   {

          for (int j = i +

1; j < n; j++)

          {

                 double   a, b;        


                 string   expa, expb; 
    

                 a =

number[i];

                 b =

number[j];

                 number[j]

= number[n - 1]; //递归之后,n比以前小一位,所以可以不停向前赋值

                 expa   =  

expression[i];

                 expb   =  

expression[j];

                 expression[j]  = 

expression[n - 1]; //递归之后,n比以前小一位,所以可以不停向前赋值

                 expression[i]   =  

‘(’ + expa

  • ‘+’ +
    expb + ‘)’;
    //加法不需要分顺序

                 number[i]   =  
    

a + b;
Search(n-1);

                 expression[i]   =   '('   +  

expa + ‘-’

  • expb +
    ‘)’; //减法应该分顺序,减数以及被减数

                 number[i]   =  
    

a - b;

                 Search(n-1);


                 expression[i]

= ‘(’ + expa + ‘-’ + expb + ‘)’; //减法应该分顺序,减数以及被减数

                 number[i]   =  

a - b;

                 Search(n-1);
      

                 expression[i]   =  

‘(’ + expb

  • ‘-’ +
    expa + ‘)’;
    //减法应该分顺序,减数以及被减数

                 number[i]   =  
    

b - a;

                 Search(n-1);
      

                 expression[i]   =  

‘(’ + expa

  • ‘*’ +
    expb + ‘)’;
    //乘法不需要分顺序

                 number[i]   =  
    

a * b;

                 Search(n-1);
      

                 if (b !=
                 {           

                      expression[i]   =  

‘(’ + expa

  • ‘/’ +
    expb + ‘)’;
    //除法应该分顺序,除数以及被除数

                        number[i]
    

= a / b;

                        Search(n-1);  

                 }           

                 if (a !=
                 {

                        expression[i]

= ‘(’ + expb + ‘/’ + expa + ‘)’; //除法应该分顺序,除数以及被除数

                        number[i]   =  

b / a;

                        Search(n-1);        

                 }              

                 number[i]   =  

a; //这4句语句是为了防止如果上面几种可能都失败了的话,

                 number[j]   =  

b; //就把原来的赋值撤消回去,以无干扰的正确的进入到下一次

                 expression[i]   =  

expa; //for循环队列中。

                 expression[j]   =  

expb; //

          }      

   }

}

int main()

{

   int count = 0;

   cout << "请依次输入4个数字:\n";  

   for (int i = 0; i <

COUNT_OF_NUMBER; i++)

   {

          char   buffer[20];       

          cout <<

“第” << i + 1
<< “个卡片:”;

          cin >>

number[i];

          itoa(number[i],

buffer, 10); //itoa()函数的作用是把第一个参数(数值)传送到第二个参数(字符串)中去,第三个

                                                              //参数(int型)是该数值在字符串里以什么进制存放。    

          expression[i]   =  

buffer;

   }  

   cout<<endl;  

   Search(COUNT_OF_NUMBER)

;

   if(Judgement==true)  

   {      

          cout   <<  

“\n成功” <<
endl;

          cout<<"所以可以计算的次数总和 = "<< count << endl;  

   }    

   else

   {

          cout <<

“失败” << endl;

   }

   system("pause");

return 0;

}
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值