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;
    }

  • 相关阅读:
    JS数组存储(两个数组相等,一个改变,另一个跟着改变)
    图片404加载失败后如何处理
    为什么重写equals方法,还必须要重写hashcode方法
    Java中HashMap和TreeMap的区别深入理解
    java中String数组和List的互相转化
    log4j重复打印的解决方法
    mysql 允许在唯一索引的字段中出现多个null值
    elasticsearch 常见查询及聚合的JAVA API
    A记录(主机名解析)、CNAME(别名解析)和URL转发(域名转发)
    域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7429765.html
Copyright © 2011-2022 走看看