22-算24

/*题目内容:

 问题描述:输入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;
}

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7429765.html