运算出分数的算24

来源:互联网 发布:linux 删除多个文件夹 编辑:程序博客网 时间:2024/06/05 17:35


描述:

算24的一个经典例子是5 5 5 1,在中间结果可以出现分数的情况下是有解的。(5-1/5)*5
在允许中间结果是分数的情况下,如何编写一个算24的程序。

输入:

4个1~13之间的整数。

输出:

在允许中间结果是分数的情况下,能得到24输出“Yes”,否则输出“No”。

输入样例:

5 5 5 1

输出样例:

Yes

题目要求 1. 除数不为0

               2.运算结果可以出现分数

#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace std

int a[4] = {0} ;
int b[4] = {0} ;
int used[4] = {0} ;
int flag = 0 ;

void search(int m) ;
void judge() ;
double cal(double e , int f , double g) ;

int main()
{
  int i ;
  for(i = 0 ; i <= 3 ; i++)
  {
   cin >> b[i]  ;//用b[4]这个数组存储输入的四个数
  }
  search(0) ;
  if(flag == 1)
  {
   cout << "Yes" << endl ;
  }
  if(flag == 0)
  {
   cout << "No" << endl ;
  }
}
void search(int m)
{   int i ;
 if(m == 4)
 {
  judge() ;
 }
 for(i = 0 ; i <= 3 ; i++)
 {
  if(used[i] == 0)
  {
   a[m] = b[i]  ;//a[4]这个数组是对b[4]这个数组进行重新的排列
   used[i] = 1 ;
   search(m + 1) ;
   used[i] = 0;
  }
 }
}
void judge()
{
 int i , j , k , l ;//i是运算顺序 j,k,l是运算符  temp1 , temp2 是中间两次运算的结果
 double  n , m , q ;
 

 for(i = 0 ; i <= 4 ; i++)
 {
  if(i == 0)//1 2 3
     {
      for(j = 0 ; j < 4 ; j++)
   {
     if(j == 3 && a[1] == 0 )
   {
    continue ;
   }
   n = cal(a[0] , j , a[1]) ;
  
    for(k = 0 ; k < 4 ; k++)
    {
     if(k == 3 && a[2] == 0 )
      {
    continue ;
      }
      m = cal(n , k , a[2]) ;
     for(l = 0 ; l < 4 ; l++)
     {
      if(l == 3 && a[3] == 0 )
          {
         continue ;
          }
          q = cal(m , l , a[3]) ;
      if( fabs(q-24) < 0.000001)
      {
        flag =  1 ;
      }
     }
    }
   }
  }
  if(i == 1)//1 3 2
     {
       for(j = 0 ; j < 4 ; j++)
   {  
       if(j == 3 && a[1] == 0 )
   {
    continue ;
   }
   n = cal(a[0] , j , a[1]) ;
    for(k = 0 ; k < 4 ; k++)
    {
     if(k == 3 && a[3] == 0 )
      {
    continue ;
      }
      m = cal(a[2] , k , a[3]) ;
   for(l = 0 ; l < 4 ; l++)
   {
     if(l == 3 && m == 0 )
        {
         continue ;
        }
        q = cal(n , l , m) ;
     if( fabs(q -24) <0.000001 );//因为浮点数计算的时候会有误差,所以这样相当于检验q是否与24相等
      {
    flag =  1 ;
      }
   }
    }
   }
  }
  if(i == 2)//2 1 3
     {
      for(j = 0 ; j < 4 ; j++)
   {
     if(j == 3 && a[2] == 0 )
   {
    continue ;
   }
   n = cal(a[1] , j , a[2]) ;
    for(k = 0 ; k < 4 ; k++)
    {
       if(k == 3 && n == 0 )
        {
         continue ;
        }
        m = cal(a[0] , k , n) ;
       
     for(l = 0 ; l < 4 ; l++)
     {
      if(l == 3 && a[3] == 0 )
         {
         continue ;
         }
         q = cal (m , l , a[3]) ;
      if( fabs(q-24)<0.000001)
      {
    flag =  1 ;
      }
     }
    }
   }
  }
  if(i == 3)//2 3 1
     {
      for(j = 0 ; j < 4 ; j++)
   {
    if(j == 3 && a[2] == 0 )
   {
    continue ;
   }
   n = cal(a[1] , j , a[2]) ;
    for(k = 0 ; k < 4 ; k++)
    {
       if(k == 3 && a[3] == 0 )
        {
         continue ;
        }
        m = cal(n , k , a[3]) ;
     for(l = 0 ; l < 4 ; l++)
     {
      if(l == 3 && m == 0)
          {
         continue ;
          }
          q = cal(a[0] , l , m) ;
      if( fabs(q-24)<0.000001)
      {
        flag =  1 ;
      }
     }
    }
   }
  }
  if(i == 4)//3 2 1
     {
      for(j = 0 ; j < 4 ; j++)
   {
     if(j == 3 && a[3] == 0 )
   {
    continue ;
   }
   n = cal(a[2] , j , a[3]) ;
    for(k = 0 ; k < 4 ; k++)
    {
       if(k == 3 && n == 0 )
        {
         continue ;
        }
        m = cal(a[1] , k , n) ;
     for(l = 0 ; l < 4 ; l++)
     {
      if(l == 3 && m == 0 )
         {
         continue ;
         }
         q = cal(a[0] , l , m) ;
      if( fabs(q-24)<0.000001 )
      {
    flag = 1 ;
      }
     }
    }
   }
  }
 }
}
double cal(double e , int f , double g)
{
 if(f == 0)
 {
  return (e+g) ;
 }
 if(f == 1)
 {
  return (e-g) ;
 }
 if(f == 2)
 {
  return (e*g) ;
 }
 if(f == 3)
 {
  return (e*1.0/g) ;
 }
}


原创粉丝点击