/*题目内容:
问题描述:输入4个数,通过 加、减、乘、除运算看能否得到 结果 24,每个数只用一次。
输入描述
输入四个正整数
输出描述
能通过某种方式得到24则输出1,不能则输出0
输入样例
6 6 6 6
输出样例
1
*/
// 使用递归的思路求解:求四个数的运算结果,运算下去,第一步后就是两个数合并成一个,算三个数的结果,
// 所以算到最后必然是得的两个数,进行运算得到一个数,最后递归的结束就是当只剩下一个数时是否等于24,等于就对了
//返回1,否则返回0,注意的是有除法运算就必定进行浮点数运算了,所以,最后判断是否等于24,不能直接用 == 24 来判断,
//需要和24做差当差小于无穷小时就认为相等了,无穷小可以取 1e-6等。
#include <iostream>
//#include <algorithm>
#include <cmath>
using namespace std;
int suan(double *b, int n){
if(n == 1){
if(fabs(24 - b[0]) <= 0.000000001) //fabs()是math里判断绝对值的
return 1;
else
return 0;
}
double c[4];
for(int i = 0; i < n - 1; i++){ //枚举任意两个数去合并,用两重循环
for(int j = i + 1; j < n; j++){ //注意枚举的顺序,没有考虑这两个数的先后,所以后面要考虑
int m = 0;
for(int k = 0; k < n; k++){ //将剩余的数装入一个新数组,
if(k != i && k != j) //去掉枚举的两个数,就是剩下的数
c[m++] = b[k];
}
c[m] = b[i] + b[j]; //尝试各种运算
if(suan(c, m + 1)) //进行递归,并判断,若可以组成了,就结束,没有就向下尝试其他运算
return 1;
c[m] = b[i] - b[j];
if(suan(c, m + 1))
return 1;
c[m] = b[j] - b[i];
// if(suan(c, m + 1));
if(suan(c, m + 1))
return 1;
c[m] = b[i] * b[j];
if(suan(c, m + 1))
return 1;
if(b[i] != 0){
c[m] = b[j] / b[i]; //进行除法法前线保证除数非零
if(suan(c, m + 1))
return 1;
}
if(b[j] != 0){
c[m] = b[i] / b[j];
if(suan(c, n - 1))
return 1;
}
}
}
return 0;
}
int main(){
double a[5];
for(int i = 0; i < 4; i++)
cin >> a[i];
cout << suan(a, 4);
return 0;
}