描述:
算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
#include
#include
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) ;
}
}