9 8 7 6 5 4 3 2 1 = 100

简介: 题目描述:现有一等式;9 8 7 6 5 4 3 2 1 = 100。为了使等式成立,需要在数字间填写加号或者减号(可以不填,但不能填入其他符号)。之间没有填入符号的数字组合成一个数。

题目描述:现有一等式;9 8 7 6 5 4 3 2 1 = 100。为了使等式成立,需要在数字间填写加号或者减号(可以不填,但不能填入其他符号)。之间没有填入符号的数字组合成一个数。例如;98 - 76 + 54 + 3 + 21 = 100 和 98 - 7 - 6 - 5 - 4 + 3 + 21 = 100。请编写代码找出所有符合等式的答案。


解决思路:

  • 用暴力解法,一共9个数字,数字与数字之间有8个空,那么每个空有三种情况:加号、减号和空。那么一共有3^8 = 6561种情况。
import java.util.Stack;

/**
 * 1 2 3 4 5 6 7 8 9 = 110
 * 在数字间填入加号或者减号(可以不填,但不能填入其它符号)使等式成立。
 * 一种更好的方法是:
 * 每一个空隙之间都有三种可能,"+", "-", "",所以一共有3^8种可能。
 */
public class Main {

    private static final char[] NUMBERS = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private static final String[] OPERATORS = {"+", "-", ""};
    private static final int RESULT = 100;  // 计算结果


    private static void sortAndCompute(int numIndex, String buffer) {
        // 说明到最后一个字符了
        if(numIndex == NUMBERS.length - 1) {
            buffer += NUMBERS[numIndex];
            String formula = buffer.toString();
            if(sum(formula) == RESULT) {
                System.out.println(formula + " = " + RESULT);
            }
            return;
        }

        for(int operIndex = 0; operIndex < OPERATORS.length; ++operIndex) {
            buffer += NUMBERS[numIndex];
            buffer += OPERATORS[operIndex];
            sortAndCompute(numIndex + 1, buffer);
            // 消除前面两个已经添加的字符恢复原状,以便下一次循环的叠加
            // 但是当中间连接符变为''的时候,则只删除buffer中的前面一个字符
            buffer = operIndex != 2 ? buffer.substring(0, buffer.length() - 2)
                    : buffer.substring(0, buffer.length() - 1);
        }
    }

    private static int sum(String formula) {
        if(formula == null || formula.trim().length() == 0)
            throw new IllegalArgumentException("formula is invalid!");

        Stack<String> numStack = new Stack<String>();
        Stack<String> operStack = new Stack<String>();
        StringBuffer numBuffer = new StringBuffer();

        formula += "#"; // 添加一个结束符到公式末尾便于计算
        char[] chs = formula.toCharArray();
        for(int index = 0; index < formula.length(); ++index) {
            if(chs[index] != '+' && chs[index] != '-' && chs[index] != '#') {
                numBuffer.append(chs[index]); //把数放进入,如果是9 8,则会拼接起来
            } else {
                numStack.push(numBuffer.toString()); //将数放入stack
                numBuffer.delete(0, numBuffer.length()); //将buffer清空

                if(operStack.isEmpty()){
                    operStack.push(chs[index] + "");
                }else {
                    int numAft = Integer.parseInt(numStack.pop()); //取一数
                    int numBef = Integer.parseInt(numStack.pop());//取另一个数
                    String oper = operStack.pop(); // 取符号
                    int sum = oper.equals("+") ? numBef + numAft : numBef - numAft;
                    numStack.push(sum + ""); //将运算后的数压栈
                    operStack.push(chs[index] + ""); //将新符号压栈
                }
            }
        }
        return Integer.parseInt(numStack.pop());
    }

    public static void main(String[] args) {
        sortAndCompute(0, "");
    }
}

目录
相关文章
|
弹性计算 负载均衡 对象存储
阿里云免费云服务器ECS领取教程
2023阿里云免费云服务器ECS领取教程,个人和企业用户均可以申请,个人免费服务器1核2GB 每月750小时,企业u1服务器2核8GB免费使用3个月,阿里云百科分享阿里云免费服务器申请入口、个人和企业免费配置、申请资格条件及云服务器免费使用时长
1548 0
|
弹性计算 Kubernetes 索引
使用Kubectl部署web服务到K8s集群
本场景带您体验如何使用k8s的原生命令kubectl部署一个web应用(魔方应用)的镜像到k8s集群中,并通过Ingress将部署的服务暴露出来由外部访问。
|
SQL 分布式计算 数据管理
spark SQL配置连接Hive Metastore 3.1.2
Hive Metastore作为元数据管理中心,支持多种计算引擎的读取操作,例如Flink、Presto、Spark等。本文讲述通过spark SQL配置连接Hive Metastore,并以3.1.2版本为例。
spark SQL配置连接Hive Metastore 3.1.2
|
弹性计算 应用服务中间件 网络安全
【图文】如何用云服务器搭建一个https的网站?
出现了“恭喜,站点创建成功!”,说明一个https的网站已经搭建成功了,已经实现了全站https。现在你可以登录FTP,然后删除FTP根目录下的index.html,然后再上传你的网站源码,安装网站。
18409 0
【图文】如何用云服务器搭建一个https的网站?
|
流计算 API 监控
Apache Flink 进阶(八):详解 Metrics 原理与实战
Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。
|
API 开发者 数据可视化
开放平台能为开发者带来什么价值?
2019杭州云栖大会大咖有约,由阿里云开放平台负责人圭多带来以“开放平台能为开发者带来什么价值?”为题的演讲。本文对阿里云的开放平台进行了详细的阐述,即对阿里云开放平台到底开放的是什么,开发者又被给予了哪些开发能力进行了详细的介绍,包括丰富完整的API产品体系,及如何让开发者更好享受技术红利?
|
大数据
让你秒成大数据“砖家”:富有哲理的12条大数据金句
我们编译了12个富有品味的大数据金句,这些内容或许能帮你“指点江山”,让你秒成大数据“砖家”。
5172 0
|
编解码 安全 索引
FFmpeg任意文件读取漏洞分析
这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花。 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static.hx99.net/static/drops/papers-15598.html 这个漏洞实际上也是利用了ffmpeg在处理 HLS 播放列表文件的过程中,由于支持非常多的协议,如http、file、concat等等,导致可以构造恶意的url造成 SSRF 攻击和本地文件泄露。
3229 0