Java 四则运算


前言

Github地址

设计实现过程

数据结构

使用二叉树存放四则运算式,比如1+2×3÷(4-5)+6这个表达式就可以使用以下二叉树表示,中序遍历二叉树时就可以还原四则运算。

作业要求四则运算式中不能出现负数,(4-5)在二叉树中调换位置即可。

2.2 实现步骤

实现步骤

流程图

在主函数main()中输入-n-r两个参数, 传入并执行generateMap()函数,在generateMap() 中用for循环new ArithmeticTree对象,在ArithmeticTree的构造器中,计算了四则运算结果,返回一个OperatorNode结点,在generateMap()函数调用ArithmeticTree对象中的值,包括计算出的结果,调用hashMap.put()保存在HashMap对象中,再传入writFile()写出文件。

三、代码说明

功能
Main 主函数,获取输入值,计算结果
ArithmeticTree 构建四则运算的二叉树
FractionOperation 分数的四则运算操作
DataNode 存放数据的结点
OperatorNode 存放操作符的结点
FileUtils IO流操作,文件输入输出
GenerateUtils 随机生成四则运算
   /**
     * 获取随机范围内的随机整数
     * @param range 范围
     * @return 随机数
     */
    public static int getRandomInRange(int range) {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        return random.nextInt(range);
    }
 /**
     * 构建生成四则运算表达式的二叉树
     * @param number 运算符数量
     * @return 二叉树头节点
     */
    public DataNode generateNode(int number) {
        //如果是0就构造叶子节点
        if (number == 0) {
            return new DataNode(FractionOperation.generateFraction(), null, null, 1);
        }
        //其他都是构造符号节点
        OperatorNode rootNode = new OperatorNode(null, null, OPERATORS[GenerateUtils.getRandomInRange(4)]);
        int leftNum = GenerateUtils.getRandomInRange(number);
        //递归下去构造左孩子和右孩子
        rootNode.left = generateNode(leftNum);
        //总数要减去当前已经构建出来的这一个节点
        rootNode.right = generateNode(number - 1 - leftNum);
        //计算结果
        FractionOperation result = calculate(rootNode.operator, rootNode.left.result, rootNode.right.result);
        //如果是负数,交换左右孩子
        if (result.isNegative()) {
            DataNode tmp = rootNode.left;
            rootNode.left = rootNode.right;
            rootNode.right = tmp;
        }
        rootNode.result = result;
        rootNode.high = Math.max(rootNode.left.high, rootNode.right.high) + 1;
        return rootNode;
    }

四、测试运行

输入

生成文件

10000道题目

答案


猜你喜欢

转载自blog.csdn.net/qq_44830568/article/details/109085280
今日推荐