zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    上周热点回顾(8.25-8.31)团队
    上周热点回顾(8.18-8.24)团队
    Suricata产生的数据存储目录
    Suricata的规则解读(默认和自定义)
    Suricata的总体架构
    Suricata是什么?
    snort + barnyard2如何正确读取snort.unified2格式的数据集并且入库MySQL(图文详解)
    基于CentOS6.5或Ubuntu14.04下Suricata里搭配安装 ELK (elasticsearch, logstash, kibana)(图文详解)
    Windows里安装wireshark或者ethereal工具(包括汉化破解)(图文详解)
    Tcpdump的用法
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7429765.html
Copyright © 2011-2022 走看看